From a1e5baacacc050f168b23e4c3362d46bf2255b77 Mon Sep 17 00:00:00 2001 From: Edwin Noorlander Date: Sat, 8 Aug 2026 18:02:14 +0200 Subject: [PATCH] CMS 2.0 - Theme engine, logging, admin improvements Major changes: - New ThemeManager with Twig templating and SCSS compilation - Dynamic themes system (themes/default, themes/demo) - LogManager with SQLite storage and syslog forwarding - RequestLogger with static helper methods - Admin UI overhaul (Bootstrap 5, dark mode) - Admin config page with logging and theme settings - Admin logs page with filters and search - Removed legacy Mustache templates - Removed test plugin and theme - Composer dependencies: Twig, scssphp, CommonMark, MaxMind GeoIP --- .gitignore | 3 + AGENTS.md | 34 +- README.en.md | 22 +- README.md | 22 +- admin/templates/layout.php | 5 + admin/templates/pages/config.php | 84 +- admin/templates/pages/content-edit.php | 6 + admin/templates/pages/content-new.php | 6 + admin/templates/pages/logs.php | 182 +- admin/templates/pages/theme-new.php | 38 + admin/templates/pages/theme.php | 341 +- cms/core/class/CodePressCMS.php | 103 +- cms/core/class/LogManager.php | 365 ++ cms/core/class/Logger.php | 8 + cms/core/class/RequestLogger.php | 73 + cms/core/class/ThemeManager.php | 203 + cms/core/config.php | 61 +- cms/core/index.php | 2 + cms/router.php | 20 + cms/templates/html_content.mustache | 5 - cms/templates/layout.mustache | 552 --- cms/templates/markdown_content.mustache | 5 - cms/templates/php_content.mustache | 5 - composer.json | 4 +- composer.lock | 987 +++- config.json.example | 28 +- docs/TODO.md | 4 +- guide/en.codepress.md | 142 +- guide/nl.codepress.md | 142 +- plugins/test/README.md | 3 - plugins/test/config.json | 3 - plugins/test/test.php | 35 - public/admin.php | 380 +- public/index.php | 16 +- public/themes/test_bg.jpg | Bin 360343 -> 0 bytes themes/default/base.twig | 136 + themes/default/css/theme.scss | 367 ++ themes/default/custom1.twig | 18 + themes/default/full_content.twig | 11 + themes/default/js/theme.js | 21 + themes/default/left_sidebar.twig | 26 + .../default/partials/footer.twig | 36 +- .../default/partials/header.twig | 60 +- .../default/partials/navigation.twig | 8 +- themes/default/right_sidebar.twig | 26 + themes/default/theme.json | 21 +- themes/default/theme.png | Bin 0 -> 21857 bytes themes/demo/base.twig | 136 + themes/demo/css/theme.scss | 331 ++ themes/demo/custom1.twig | 18 + themes/demo/full_content.twig | 11 + themes/demo/js/theme.js | 21 + themes/demo/left_sidebar.twig | 26 + themes/demo/partials/footer.twig | 48 + themes/demo/partials/header.twig | 75 + themes/demo/partials/navigation.twig | 17 + themes/demo/right_sidebar.twig | 26 + themes/demo/theme.json | 12 + themes/demo/theme.png | Bin 0 -> 21121 bytes themes/gen-preview.sh | 47 + themes/test/theme.json | 13 - vendor/composer/autoload_files.php | 6 + vendor/composer/autoload_psr4.php | 13 + vendor/composer/autoload_static.php | 82 + vendor/composer/ca-bundle/LICENSE | 19 + vendor/composer/ca-bundle/README.md | 85 + vendor/composer/ca-bundle/composer.json | 54 + vendor/composer/ca-bundle/res/cacert.pem | 2910 +++++++++++ vendor/composer/ca-bundle/src/CaBundle.php | 322 ++ vendor/composer/installed.json | 1027 ++++ vendor/composer/installed.php | 130 +- vendor/composer/platform_check.php | 4 +- vendor/geoip2/geoip2/CHANGELOG.md | 323 ++ vendor/geoip2/geoip2/LICENSE | 202 + vendor/geoip2/geoip2/README.md | 442 ++ vendor/geoip2/geoip2/composer.json | 32 + vendor/geoip2/geoip2/examples/benchmark.php | 26 + vendor/geoip2/geoip2/src/Database/Reader.php | 299 ++ .../Exception/AddressNotFoundException.php | 12 + .../src/Exception/AuthenticationException.php | 12 + .../geoip2/src/Exception/GeoIp2Exception.php | 12 + .../geoip2/src/Exception/HttpException.php | 28 + .../src/Exception/InvalidRequestException.php | 30 + .../src/Exception/OutOfQueriesException.php | 12 + .../geoip2/geoip2/src/Model/AbstractModel.php | 68 + .../geoip2/geoip2/src/Model/AnonymousIp.php | 91 + vendor/geoip2/geoip2/src/Model/Asn.php | 58 + vendor/geoip2/geoip2/src/Model/City.php | 123 + .../geoip2/src/Model/ConnectionType.php | 50 + vendor/geoip2/geoip2/src/Model/Country.php | 96 + vendor/geoip2/geoip2/src/Model/Domain.php | 50 + vendor/geoip2/geoip2/src/Model/Enterprise.php | 15 + vendor/geoip2/geoip2/src/Model/Insights.php | 15 + vendor/geoip2/geoip2/src/Model/Isp.php | 93 + .../geoip2/geoip2/src/ProviderInterface.php | 22 + .../geoip2/src/Record/AbstractPlaceRecord.php | 67 + .../geoip2/src/Record/AbstractRecord.php | 67 + vendor/geoip2/geoip2/src/Record/City.php | 33 + vendor/geoip2/geoip2/src/Record/Continent.php | 36 + vendor/geoip2/geoip2/src/Record/Country.php | 44 + vendor/geoip2/geoip2/src/Record/Location.php | 56 + vendor/geoip2/geoip2/src/Record/MaxMind.php | 23 + vendor/geoip2/geoip2/src/Record/Postal.php | 30 + .../geoip2/src/Record/RepresentedCountry.php | 33 + .../geoip2/geoip2/src/Record/Subdivision.php | 44 + vendor/geoip2/geoip2/src/Record/Traits.php | 158 + vendor/geoip2/geoip2/src/Util.php | 36 + .../geoip2/geoip2/src/WebService/Client.php | 255 + .../Contracts/AuthorityInterface.php | 93 + .../Contracts/Conditionable.php | 26 + .../Contracts/DataPathInterface.php | 95 + .../Contracts/DomainHostInterface.php | 125 + .../Contracts/FragmentDirective.php | 55 + .../Contracts/FragmentInterface.php | 25 + .../Contracts/HostInterface.php | 59 + .../Contracts/IpHostInterface.php | 49 + .../Contracts/PathInterface.php | 93 + .../Contracts/PortInterface.php | 22 + .../Contracts/QueryInterface.php | 272 + .../Contracts/SegmentedPathInterface.php | 149 + .../Contracts/Transformable.php | 27 + .../uri-interfaces/Contracts/UriAccess.php | 29 + .../Contracts/UriComponentInterface.php | 79 + .../uri-interfaces/Contracts/UriException.php | 20 + .../uri-interfaces/Contracts/UriInterface.php | 321 ++ .../Contracts/UserInfoInterface.php | 62 + vendor/league/uri-interfaces/Encoder.php | 506 ++ .../Exceptions/ConversionFailed.php | 51 + .../Exceptions/MissingFeature.php | 21 + .../Exceptions/OffsetOutOfBounds.php | 18 + .../uri-interfaces/Exceptions/SyntaxError.php | 21 + .../uri-interfaces/FeatureDetection.php | 64 + vendor/league/uri-interfaces/HostFormat.php | 20 + vendor/league/uri-interfaces/HostRecord.php | 448 ++ vendor/league/uri-interfaces/HostType.php | 22 + .../uri-interfaces/IPv4/BCMathCalculator.php | 85 + .../league/uri-interfaces/IPv4/Calculator.php | 95 + .../league/uri-interfaces/IPv4/Converter.php | 318 ++ .../uri-interfaces/IPv4/GMPCalculator.php | 70 + .../uri-interfaces/IPv4/NativeCalculator.php | 60 + .../league/uri-interfaces/IPv6/Converter.php | 178 + .../league/uri-interfaces/Idna/Converter.php | 231 + vendor/league/uri-interfaces/Idna/Error.php | 64 + vendor/league/uri-interfaces/Idna/Option.php | 179 + vendor/league/uri-interfaces/Idna/Result.php | 64 + .../uri-interfaces/KeyValuePair/Converter.php | 188 + vendor/league/uri-interfaces/LICENSE | 20 + .../uri-interfaces/QueryComposeMode.php | 88 + .../uri-interfaces/QueryExtractMode.php | 50 + vendor/league/uri-interfaces/QueryString.php | 495 ++ .../uri-interfaces/StringCoercionMode.php | 160 + .../uri-interfaces/UriComparisonMode.php | 20 + vendor/league/uri-interfaces/UriString.php | 744 +++ .../uri-interfaces/UrnComparisonMode.php | 20 + vendor/league/uri-interfaces/composer.json | 70 + vendor/league/uri/BaseUri.php | 646 +++ vendor/league/uri/Builder.php | 358 ++ vendor/league/uri/Http.php | 386 ++ vendor/league/uri/HttpFactory.php | 25 + vendor/league/uri/LICENSE | 20 + vendor/league/uri/SchemeType.php | 36 + vendor/league/uri/Uri.php | 1967 ++++++++ vendor/league/uri/UriInfo.php | 105 + vendor/league/uri/UriResolver.php | 56 + vendor/league/uri/UriScheme.php | 199 + vendor/league/uri/UriTemplate.php | 292 ++ vendor/league/uri/UriTemplate/Expression.php | 99 + vendor/league/uri/UriTemplate/Operator.php | 225 + vendor/league/uri/UriTemplate/Template.php | 148 + .../UriTemplate/TemplateCanNotBeExpanded.php | 44 + .../league/uri/UriTemplate/VarSpecifier.php | 70 + vendor/league/uri/UriTemplate/VariableBag.php | 160 + vendor/league/uri/Urn.php | 602 +++ vendor/league/uri/composer.json | 84 + vendor/maxmind-db/reader/CHANGELOG.md | 261 + vendor/maxmind-db/reader/LICENSE | 202 + vendor/maxmind-db/reader/README.md | 214 + vendor/maxmind-db/reader/autoload.php | 47 + vendor/maxmind-db/reader/composer.json | 43 + vendor/maxmind-db/reader/ext/config.m4 | 40 + vendor/maxmind-db/reader/ext/config.w32 | 10 + vendor/maxmind-db/reader/ext/maxminddb.c | 819 ++++ vendor/maxmind-db/reader/ext/php_maxminddb.h | 24 + .../maxmind-db/reader/ext/tests/001-load.phpt | 12 + .../reader/ext/tests/002-final.phpt | 13 + .../reader/ext/tests/003-open-basedir.phpt | 12 + vendor/maxmind-db/reader/package.xml | 61 + .../reader/src/MaxMind/Db/Reader.php | 404 ++ .../reader/src/MaxMind/Db/Reader/Decoder.php | 452 ++ .../Db/Reader/InvalidDatabaseException.php | 11 + .../reader/src/MaxMind/Db/Reader/Metadata.php | 123 + .../reader/src/MaxMind/Db/Reader/Util.php | 33 + .../maxmind/web-service-common/CHANGELOG.md | 129 + vendor/maxmind/web-service-common/LICENSE | 202 + vendor/maxmind/web-service-common/README.md | 25 + .../maxmind/web-service-common/composer.json | 32 + .../web-service-common/dev-bin/release.sh | 101 + .../maxmind/web-service-common/phpstan.neon | 6 + .../src/Exception/AuthenticationException.php | 12 + .../src/Exception/HttpException.php | 42 + .../Exception/InsufficientFundsException.php | 12 + .../src/Exception/InvalidInputException.php | 14 + .../src/Exception/InvalidRequestException.php | 39 + .../Exception/IpAddressNotFoundException.php | 12 + .../Exception/PermissionRequiredException.php | 12 + .../src/Exception/WebServiceException.php | 12 + .../src/WebService/Client.php | 500 ++ .../src/WebService/Http/CurlRequest.php | 146 + .../src/WebService/Http/Request.php | 28 + .../src/WebService/Http/RequestFactory.php | 44 + vendor/psr/http-factory/LICENSE | 21 + vendor/psr/http-factory/README.md | 12 + vendor/psr/http-factory/composer.json | 38 + .../src/RequestFactoryInterface.php | 18 + .../src/ResponseFactoryInterface.php | 18 + .../src/ServerRequestFactoryInterface.php | 24 + .../src/StreamFactoryInterface.php | 45 + .../src/UploadedFileFactoryInterface.php | 34 + .../http-factory/src/UriFactoryInterface.php | 17 + vendor/psr/http-message/CHANGELOG.md | 36 + vendor/psr/http-message/LICENSE | 19 + vendor/psr/http-message/README.md | 16 + vendor/psr/http-message/composer.json | 26 + .../psr/http-message/docs/PSR7-Interfaces.md | 130 + vendor/psr/http-message/docs/PSR7-Usage.md | 159 + .../psr/http-message/src/MessageInterface.php | 187 + .../psr/http-message/src/RequestInterface.php | 130 + .../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 | 324 ++ vendor/scssphp/scssphp/LICENSE.md | 20 + vendor/scssphp/scssphp/README.md | 71 + vendor/scssphp/scssphp/composer.json | 131 + vendor/scssphp/scssphp/src/Ast/AstNode.php | 25 + .../scssphp/scssphp/src/Ast/Css/CssAtRule.php | 35 + .../scssphp/src/Ast/Css/CssComment.php | 34 + .../scssphp/src/Ast/Css/CssDeclaration.php | 84 + .../scssphp/scssphp/src/Ast/Css/CssImport.php | 37 + .../scssphp/src/Ast/Css/CssKeyframeBlock.php | 30 + .../scssphp/src/Ast/Css/CssMediaQuery.php | 250 + .../scssphp/src/Ast/Css/CssMediaRule.php | 30 + .../scssphp/scssphp/src/Ast/Css/CssNode.php | 68 + .../scssphp/src/Ast/Css/CssParentNode.php | 37 + .../scssphp/src/Ast/Css/CssStyleRule.php | 44 + .../scssphp/src/Ast/Css/CssStylesheet.php | 24 + .../scssphp/src/Ast/Css/CssSupportsRule.php | 28 + .../scssphp/scssphp/src/Ast/Css/CssValue.php | 79 + .../src/Ast/Css/IsInvisibleVisitor.php | 57 + .../src/Ast/Css/MediaQueryMergeResult.php | 23 + .../Css/MediaQuerySingletonMergeResult.php | 22 + .../src/Ast/Css/ModifiableCssAtRule.php | 97 + .../src/Ast/Css/ModifiableCssComment.php | 54 + .../src/Ast/Css/ModifiableCssDeclaration.php | 121 + .../src/Ast/Css/ModifiableCssImport.php | 71 + .../Ast/Css/ModifiableCssKeyframeBlock.php | 67 + .../src/Ast/Css/ModifiableCssMediaRule.php | 67 + .../scssphp/src/Ast/Css/ModifiableCssNode.php | 152 + .../src/Ast/Css/ModifiableCssParentNode.php | 85 + .../src/Ast/Css/ModifiableCssStyleRule.php | 88 + .../src/Ast/Css/ModifiableCssStylesheet.php | 55 + .../src/Ast/Css/ModifiableCssSupportsRule.php | 67 + .../scssphp/scssphp/src/Ast/FakeAstNode.php | 46 + .../scssphp/scssphp/src/Ast/Sass/Argument.php | 87 + .../src/Ast/Sass/ArgumentDeclaration.php | 243 + .../src/Ast/Sass/ArgumentInvocation.php | 125 + .../scssphp/src/Ast/Sass/AtRootQuery.php | 155 + .../src/Ast/Sass/CallableInvocation.php | 21 + .../src/Ast/Sass/ConfiguredVariable.php | 70 + .../scssphp/src/Ast/Sass/Expression.php | 30 + .../Expression/BinaryOperationExpression.php | 146 + .../Ast/Sass/Expression/BinaryOperator.php | 83 + .../Ast/Sass/Expression/BooleanExpression.php | 55 + .../Ast/Sass/Expression/ColorExpression.php | 56 + .../Sass/Expression/FunctionExpression.php | 134 + .../src/Ast/Sass/Expression/IfExpression.php | 79 + .../InterpolatedFunctionExpression.php | 74 + .../Expression/IsCalculationSafeVisitor.php | 129 + .../Ast/Sass/Expression/ListExpression.php | 132 + .../src/Ast/Sass/Expression/MapExpression.php | 64 + .../Ast/Sass/Expression/NullExpression.php | 47 + .../Ast/Sass/Expression/NumberExpression.php | 64 + .../Expression/ParenthesizedExpression.php | 55 + .../Sass/Expression/SelectorExpression.php | 47 + .../Ast/Sass/Expression/StringExpression.php | 181 + .../Sass/Expression/SupportsExpression.php | 56 + .../Expression/UnaryOperationExpression.php | 82 + .../src/Ast/Sass/Expression/UnaryOperator.php | 37 + .../Ast/Sass/Expression/ValueExpression.php | 59 + .../Sass/Expression/VariableExpression.php | 90 + .../scssphp/scssphp/src/Ast/Sass/Import.php | 22 + .../src/Ast/Sass/Import/DynamicImport.php | 62 + .../src/Ast/Sass/Import/StaticImport.php | 73 + .../scssphp/src/Ast/Sass/Interpolation.php | 112 + .../scssphp/src/Ast/Sass/SassDeclaration.php | 37 + .../scssphp/scssphp/src/Ast/Sass/SassNode.php | 24 + .../scssphp/src/Ast/Sass/SassReference.php | 50 + .../scssphp/src/Ast/Sass/Statement.php | 30 + .../src/Ast/Sass/Statement/AtRootRule.php | 72 + .../scssphp/src/Ast/Sass/Statement/AtRule.php | 81 + .../Sass/Statement/CallableDeclaration.php | 82 + .../src/Ast/Sass/Statement/ContentBlock.php | 46 + .../src/Ast/Sass/Statement/ContentRule.php | 64 + .../src/Ast/Sass/Statement/DebugRule.php | 58 + .../src/Ast/Sass/Statement/Declaration.php | 120 + .../src/Ast/Sass/Statement/EachRule.php | 79 + .../src/Ast/Sass/Statement/ElseClause.php | 26 + .../src/Ast/Sass/Statement/ErrorRule.php | 58 + .../src/Ast/Sass/Statement/ExtendRule.php | 72 + .../src/Ast/Sass/Statement/ForRule.php | 91 + .../src/Ast/Sass/Statement/FunctionRule.php | 43 + .../Ast/Sass/Statement/HasContentVisitor.php | 31 + .../src/Ast/Sass/Statement/IfClause.php | 40 + .../scssphp/src/Ast/Sass/Statement/IfRule.php | 95 + .../src/Ast/Sass/Statement/IfRuleClause.php | 64 + .../src/Ast/Sass/Statement/ImportRule.php | 65 + .../src/Ast/Sass/Statement/IncludeRule.php | 141 + .../src/Ast/Sass/Statement/LoudComment.php | 53 + .../src/Ast/Sass/Statement/MediaRule.php | 67 + .../src/Ast/Sass/Statement/MixinRule.php | 79 + .../Ast/Sass/Statement/ParentStatement.php | 81 + .../src/Ast/Sass/Statement/ReturnRule.php | 58 + .../src/Ast/Sass/Statement/SilentComment.php | 55 + .../src/Ast/Sass/Statement/StyleRule.php | 69 + .../src/Ast/Sass/Statement/Stylesheet.php | 106 + .../src/Ast/Sass/Statement/SupportsRule.php | 62 + .../Sass/Statement/VariableDeclaration.php | 146 + .../src/Ast/Sass/Statement/WarnRule.php | 58 + .../src/Ast/Sass/Statement/WhileRule.php | 65 + .../src/Ast/Sass/SupportsCondition.php | 22 + .../SupportsCondition/SupportsAnything.php | 54 + .../SupportsCondition/SupportsDeclaration.php | 80 + .../SupportsCondition/SupportsFunction.php | 64 + .../SupportsInterpolation.php | 53 + .../SupportsCondition/SupportsNegation.php | 56 + .../SupportsCondition/SupportsOperation.php | 80 + .../src/Ast/Selector/AttributeOperator.php | 65 + .../src/Ast/Selector/AttributeSelector.php | 123 + .../src/Ast/Selector/ClassSelector.php | 58 + .../scssphp/src/Ast/Selector/Combinator.php | 49 + .../src/Ast/Selector/ComplexSelector.php | 271 + .../Ast/Selector/ComplexSelectorComponent.php | 99 + .../src/Ast/Selector/CompoundSelector.php | 156 + .../scssphp/src/Ast/Selector/IDSelector.php | 74 + .../src/Ast/Selector/IsBogusVisitor.php | 64 + .../src/Ast/Selector/IsInvisibleVisitor.php | 69 + .../src/Ast/Selector/IsUselessVisitor.php | 43 + .../src/Ast/Selector/ParentSelector.php | 62 + .../Ast/Selector/ParentSelectorVisitor.php | 20 + .../src/Ast/Selector/PlaceholderSelector.php | 69 + .../src/Ast/Selector/PseudoSelector.php | 347 ++ .../src/Ast/Selector/QualifiedName.php | 65 + .../scssphp/src/Ast/Selector/Selector.php | 127 + .../scssphp/src/Ast/Selector/SelectorList.php | 357 ++ .../src/Ast/Selector/SimpleSelector.php | 179 + .../scssphp/src/Ast/Selector/TypeSelector.php | 87 + .../src/Ast/Selector/UniversalSelector.php | 110 + vendor/scssphp/scssphp/src/Collection/Map.php | 193 + vendor/scssphp/scssphp/src/Colors.php | 247 + .../scssphp/scssphp/src/CompilationResult.php | 56 + vendor/scssphp/scssphp/src/Compiler.php | 849 ++++ .../src/Compiler/LegacyValueVisitor.php | 117 + vendor/scssphp/scssphp/src/Deprecation.php | 172 + .../scssphp/scssphp/src/DeprecationStatus.php | 11 + .../src/Evaluation/ArgumentResults.php | 105 + .../scssphp/src/Evaluation/Environment.php | 551 +++ .../scssphp/src/Evaluation/EvaluateResult.php | 53 + .../src/Evaluation/EvaluateVisitor.php | 3529 +++++++++++++ .../src/Evaluation/EvaluationContext.php | 82 + .../src/Evaluation/LoadedStylesheet.php | 61 + .../Evaluation/VisitorEvaluationContext.php | 62 + .../src/Exception/MultiSpanSassException.php | 73 + .../MultiSpanSassFormatException.php | 26 + .../MultiSpanSassRuntimeException.php | 44 + .../MultiSpanSassScriptException.php | 48 + .../scssphp/src/Exception/SassException.php | 52 + .../src/Exception/SassFormatException.php | 20 + .../src/Exception/SassRuntimeException.php | 23 + .../src/Exception/SassScriptException.php | 43 + .../src/Exception/SimpleSassException.php | 61 + .../Exception/SimpleSassFormatException.php | 64 + .../Exception/SimpleSassRuntimeException.php | 74 + .../scssphp/src/Extend/ComplexSelectorMap.php | 41 + .../src/Extend/ConcreteExtensionStore.php | 1253 +++++ .../src/Extend/EmptyExtensionStore.php | 66 + .../scssphp/scssphp/src/Extend/ExtendMode.php | 44 + .../scssphp/scssphp/src/Extend/ExtendUtil.php | 1292 +++++ .../scssphp/scssphp/src/Extend/Extender.php | 86 + .../scssphp/scssphp/src/Extend/Extension.php | 68 + .../scssphp/src/Extend/ExtensionStore.php | 63 + .../scssphp/src/Extend/MergedExtension.php | 83 + .../scssphp/scssphp/src/Extend/ObjectSet.php | 61 + .../scssphp/src/Extend/SimpleSelectorMap.php | 31 + .../scssphp/src/Function/ColorFunctions.php | 886 ++++ .../scssphp/src/Function/FunctionRegistry.php | 201 + .../scssphp/src/Function/ListFunctions.php | 183 + .../scssphp/src/Function/MapFunctions.php | 213 + .../scssphp/src/Function/MathFunctions.php | 205 + .../scssphp/src/Function/MetaFunctions.php | 96 + .../src/Function/SelectorFunctions.php | 204 + .../scssphp/src/Function/StringFunctions.php | 219 + .../src/Importer/CanonicalizeContext.php | 76 + .../src/Importer/CanonicalizeResult.php | 28 + .../src/Importer/FilesystemImporter.php | 92 + .../scssphp/src/Importer/ImportCache.php | 297 ++ .../scssphp/src/Importer/ImportContext.php | 84 + .../scssphp/src/Importer/ImportUtil.php | 141 + .../scssphp/scssphp/src/Importer/Importer.php | 170 + .../scssphp/src/Importer/ImporterResult.php | 59 + .../src/Importer/LegacyCallbackImporter.php | 66 + .../scssphp/src/Importer/NoOpImporter.php | 44 + .../src/Importer/SpecialCacheValue.php | 21 + .../Logger/DeprecationProcessingLogger.php | 195 + .../scssphp/src/Logger/LoggerInterface.php | 47 + .../scssphp/src/Logger/QuietLogger.php | 32 + .../scssphp/src/Logger/StreamLogger.php | 82 + vendor/scssphp/scssphp/src/Node.php | 43 + vendor/scssphp/scssphp/src/Node/Number.php | 827 ++++ vendor/scssphp/scssphp/src/OutputStyle.php | 48 + .../scssphp/src/Parser/AtRootQueryParser.php | 54 + .../scssphp/scssphp/src/Parser/CssParser.php | 187 + .../scssphp/src/Parser/FormatException.php | 36 + .../src/Parser/InterpolationBuffer.php | 106 + .../scssphp/src/Parser/InterpolationMap.php | 234 + .../src/Parser/KeyframeSelectorParser.php | 103 + .../scssphp/src/Parser/LineScanner.php | 181 + .../scssphp/src/Parser/MediaQueryParser.php | 153 + .../src/Parser/MultiSourceFormatException.php | 43 + vendor/scssphp/scssphp/src/Parser/Parser.php | 1021 ++++ .../scssphp/scssphp/src/Parser/SassParser.php | 568 +++ .../scssphp/scssphp/src/Parser/ScssParser.php | 277 ++ .../scssphp/src/Parser/SelectorParser.php | 614 +++ .../scssphp/src/Parser/StringScanner.php | 339 ++ .../scssphp/src/Parser/StylesheetParser.php | 4356 +++++++++++++++++ .../src/SassCallable/BuiltInCallable.php | 207 + .../src/SassCallable/PlainCssCallable.php | 42 + .../scssphp/src/SassCallable/SassCallable.php | 71 + .../src/SassCallable/UserDefinedCallable.php | 57 + .../src/Serializer/SerializeResult.php | 29 + .../src/Serializer/SerializeVisitor.php | 1904 +++++++ .../scssphp/src/Serializer/Serializer.php | 93 + .../src/Serializer/SimpleStringBuffer.php | 60 + .../src/Serializer/SourceMapBuffer.php | 43 + .../scssphp/src/Serializer/StringBuffer.php | 31 + .../Serializer/TrackingSourceMapBuffer.php | 194 + .../scssphp/scssphp/src/SourceMap/Base64.php | 101 + .../scssphp/src/SourceMap/Base64VLQ.php | 89 + .../scssphp/src/SourceMap/Builder/Entry.php | 62 + .../scssphp/src/SourceMap/SingleMapping.php | 197 + .../scssphp/src/SourceMap/TargetEntry.php | 29 + .../scssphp/src/SourceMap/TargetLineEntry.php | 28 + .../scssphp/src/SourceSpan/LazyFileSpan.php | 131 + .../scssphp/src/SourceSpan/MultiSpan.php | 127 + .../scssphp/scssphp/src/StackTrace/Frame.php | 112 + .../scssphp/scssphp/src/StackTrace/Trace.php | 53 + vendor/scssphp/scssphp/src/Syntax.php | 44 + vendor/scssphp/scssphp/src/Type.php | 32 + vendor/scssphp/scssphp/src/Util.php | 133 + vendor/scssphp/scssphp/src/Util/ArrayUtil.php | 48 + vendor/scssphp/scssphp/src/Util/AstUtil.php | 39 + vendor/scssphp/scssphp/src/Util/Box.php | 52 + vendor/scssphp/scssphp/src/Util/Character.php | 169 + vendor/scssphp/scssphp/src/Util/Equatable.php | 21 + .../scssphp/src/Util/EquatableUtil.php | 88 + vendor/scssphp/scssphp/src/Util/ErrorUtil.php | 67 + .../scssphp/scssphp/src/Util/IterableUtil.php | 98 + vendor/scssphp/scssphp/src/Util/ListUtil.php | 160 + .../scssphp/scssphp/src/Util/LoggerUtil.php | 34 + .../Util/MakeExpressionCalculationSafe.php | 71 + .../scssphp/src/Util/ModifiableBox.php | 67 + .../scssphp/scssphp/src/Util/NumberUtil.php | 305 ++ .../scssphp/scssphp/src/Util/ParserUtil.php | 68 + vendor/scssphp/scssphp/src/Util/Path.php | 292 ++ vendor/scssphp/scssphp/src/Util/SpanUtil.php | 148 + .../scssphp/scssphp/src/Util/StringUtil.php | 181 + vendor/scssphp/scssphp/src/Util/UriUtil.php | 157 + .../src/Value/CalculationOperation.php | 77 + .../scssphp/src/Value/CalculationOperator.php | 49 + .../scssphp/scssphp/src/Value/ColorFormat.php | 23 + .../scssphp/src/Value/ColorFormatEnum.php | 28 + .../scssphp/src/Value/ComplexSassNumber.php | 92 + .../scssphp/src/Value/ListSeparator.php | 34 + .../scssphp/src/Value/SassArgumentList.php | 60 + .../scssphp/scssphp/src/Value/SassBoolean.php | 75 + .../scssphp/src/Value/SassCalculation.php | 1153 +++++ .../scssphp/scssphp/src/Value/SassColor.php | 407 ++ .../scssphp/src/Value/SassFunction.php | 59 + vendor/scssphp/scssphp/src/Value/SassList.php | 139 + vendor/scssphp/scssphp/src/Value/SassMap.php | 127 + .../scssphp/scssphp/src/Value/SassMixin.php | 62 + vendor/scssphp/scssphp/src/Value/SassNull.php | 62 + .../scssphp/scssphp/src/Value/SassNumber.php | 1045 ++++ .../scssphp/scssphp/src/Value/SassString.php | 236 + .../src/Value/SingleUnitSassNumber.php | 333 ++ .../scssphp/src/Value/SpanColorFormat.php | 33 + .../scssphp/src/Value/UnitlessSassNumber.php | 223 + vendor/scssphp/scssphp/src/Value/Value.php | 683 +++ vendor/scssphp/scssphp/src/ValueConverter.php | 129 + vendor/scssphp/scssphp/src/Version.php | 23 + .../src/Visitor/AnySelectorVisitor.php | 97 + .../scssphp/src/Visitor/CssVisitor.php | 79 + .../scssphp/src/Visitor/EveryCssVisitor.php | 82 + .../scssphp/src/Visitor/ExpressionVisitor.php | 126 + .../src/Visitor/ModifiableCssVisitor.php | 78 + .../src/Visitor/ReplaceExpressionVisitor.php | 216 + .../src/Visitor/SelectorSearchVisitor.php | 92 + .../scssphp/src/Visitor/SelectorVisitor.php | 90 + .../src/Visitor/StatementSearchVisitor.php | 230 + .../scssphp/src/Visitor/StatementVisitor.php | 174 + .../scssphp/src/Visitor/ValueVisitor.php | 83 + vendor/scssphp/scssphp/src/Warn.php | 48 + vendor/scssphp/source-span/LICENSE.md | 20 + vendor/scssphp/source-span/README.md | 22 + vendor/scssphp/source-span/composer.json | 43 + .../source-span/src/ConcreteFileSpan.php | 156 + .../scssphp/source-span/src/FileLocation.php | 52 + vendor/scssphp/source-span/src/FileSpan.php | 20 + .../src/Highlighter/AsciiGlyph.php | 18 + .../source-span/src/Highlighter/Highlight.php | 205 + .../src/Highlighter/Highlighter.php | 538 ++ .../source-span/src/Highlighter/Line.php | 40 + .../source-span/src/SimpleSourceLocation.php | 59 + .../source-span/src/SimpleSourceSpan.php | 53 + .../src/SimpleSourceSpanWithContext.php | 68 + vendor/scssphp/source-span/src/SourceFile.php | 285 ++ .../source-span/src/SourceLocation.php | 47 + .../source-span/src/SourceLocationMixin.php | 34 + vendor/scssphp/source-span/src/SourceSpan.php | 110 + .../source-span/src/SourceSpanMixin.php | 132 + .../source-span/src/SourceSpanWithContext.php | 16 + vendor/scssphp/source-span/src/Util.php | 362 ++ vendor/symfony/filesystem/CHANGELOG.md | 97 + .../Exception/ExceptionInterface.php | 21 + .../Exception/FileNotFoundException.php | 34 + .../filesystem/Exception/IOException.php | 36 + .../Exception/IOExceptionInterface.php | 25 + .../Exception/InvalidArgumentException.php | 19 + .../filesystem/Exception/RuntimeException.php | 19 + vendor/symfony/filesystem/Filesystem.php | 781 +++ vendor/symfony/filesystem/LICENSE | 19 + vendor/symfony/filesystem/Path.php | 828 ++++ vendor/symfony/filesystem/README.md | 23 + vendor/symfony/filesystem/composer.json | 34 + vendor/symfony/polyfill-ctype/Ctype.php | 232 + vendor/symfony/polyfill-ctype/LICENSE | 19 + vendor/symfony/polyfill-ctype/README.md | 12 + vendor/symfony/polyfill-ctype/bootstrap.php | 50 + vendor/symfony/polyfill-ctype/bootstrap80.php | 46 + vendor/symfony/polyfill-ctype/composer.json | 38 + vendor/symfony/polyfill-mbstring/LICENSE | 19 + vendor/symfony/polyfill-mbstring/Mbstring.php | 1045 ++++ vendor/symfony/polyfill-mbstring/README.md | 13 + .../Resources/unidata/caseFolding.php | 119 + .../Resources/unidata/lowerCase.php | 1397 ++++++ .../Resources/unidata/titleCaseRegexp.php | 5 + .../Resources/unidata/upperCase.php | 1489 ++++++ .../symfony/polyfill-mbstring/bootstrap.php | 172 + .../symfony/polyfill-mbstring/bootstrap80.php | 167 + .../symfony/polyfill-mbstring/composer.json | 38 + vendor/twig/twig/CHANGELOG | 569 +++ vendor/twig/twig/LICENSE | 27 + vendor/twig/twig/README.rst | 23 + vendor/twig/twig/composer.json | 54 + vendor/twig/twig/src/AbstractTwigCallable.php | 199 + .../twig/twig/src/Attribute/AsTwigFilter.php | 60 + .../twig/src/Attribute/AsTwigFunction.php | 56 + vendor/twig/twig/src/Attribute/AsTwigTest.php | 52 + .../Attribute/FirstClassTwigCallableReady.php | 20 + vendor/twig/twig/src/Attribute/YieldReady.php | 20 + vendor/twig/twig/src/Cache/CacheInterface.php | 46 + vendor/twig/twig/src/Cache/ChainCache.php | 88 + .../twig/twig/src/Cache/FilesystemCache.php | 95 + vendor/twig/twig/src/Cache/NullCache.php | 42 + .../src/Cache/ReadOnlyFilesystemCache.php | 25 + .../src/Cache/RemovableCacheInterface.php | 20 + vendor/twig/twig/src/Compiler.php | 263 + .../twig/twig/src/DeprecatedCallableInfo.php | 67 + vendor/twig/twig/src/Environment.php | 953 ++++ vendor/twig/twig/src/Error/Error.php | 208 + vendor/twig/twig/src/Error/LoaderError.php | 21 + vendor/twig/twig/src/Error/RuntimeError.php | 22 + vendor/twig/twig/src/Error/SyntaxError.php | 46 + vendor/twig/twig/src/ExpressionParser.php | 369 ++ .../AbstractExpressionParser.php | 35 + .../ExpressionParserDescriptionInterface.php | 17 + .../ExpressionParserInterface.php | 36 + .../ExpressionParser/ExpressionParserType.php | 33 + .../ExpressionParser/ExpressionParsers.php | 155 + .../ExpressionParser/Infix/ArgumentsTrait.php | 83 + .../Infix/ArrowExpressionParser.php | 53 + .../Infix/AssignmentExpressionParser.php | 66 + .../Infix/BinaryOperatorExpressionParser.php | 80 + .../ConditionalTernaryExpressionParser.php | 62 + .../Infix/DotExpressionParser.php | 114 + .../Infix/FilterExpressionParser.php | 85 + .../Infix/FunctionExpressionParser.php | 97 + .../Infix/IsExpressionParser.php | 84 + .../Infix/IsNotExpressionParser.php | 33 + .../Infix/SquareBracketExpressionParser.php | 91 + .../ExpressionParser/InfixAssociativity.php | 18 + .../InfixExpressionParserInterface.php | 27 + .../src/ExpressionParser/PrecedenceChange.php | 42 + .../Prefix/GroupingExpressionParser.php | 88 + .../Prefix/LiteralExpressionParser.php | 233 + .../Prefix/UnaryOperatorExpressionParser.php | 72 + .../PrefixExpressionParserInterface.php | 25 + .../twig/src/Extension/AbstractExtension.php | 67 + .../twig/src/Extension/AttributeExtension.php | 179 + .../twig/twig/src/Extension/CoreExtension.php | 2223 +++++++++ .../twig/src/Extension/DebugExtension.php | 62 + .../twig/src/Extension/EscaperExtension.php | 221 + .../twig/src/Extension/ExtensionInterface.php | 80 + .../twig/src/Extension/GlobalsInterface.php | 25 + .../LastModifiedExtensionInterface.php | 23 + .../twig/src/Extension/OptimizerExtension.php | 27 + .../twig/src/Extension/ProfilerExtension.php | 52 + .../Extension/RuntimeExtensionInterface.php | 19 + .../twig/src/Extension/SandboxExtension.php | 247 + .../twig/src/Extension/StagingExtension.php | 100 + .../src/Extension/StringLoaderExtension.php | 43 + .../src/Extension/YieldNotReadyExtension.php | 30 + vendor/twig/twig/src/ExtensionSet.php | 567 +++ .../src/FileExtensionEscapingStrategy.php | 61 + vendor/twig/twig/src/Lexer.php | 621 +++ vendor/twig/twig/src/Loader/ArrayLoader.php | 75 + vendor/twig/twig/src/Loader/ChainLoader.php | 132 + .../twig/twig/src/Loader/FilesystemLoader.php | 290 ++ .../twig/twig/src/Loader/LoaderInterface.php | 49 + vendor/twig/twig/src/Markup.php | 67 + vendor/twig/twig/src/Node/AutoEscapeNode.php | 40 + vendor/twig/twig/src/Node/BlockNode.php | 50 + .../twig/twig/src/Node/BlockReferenceNode.php | 38 + vendor/twig/twig/src/Node/BodyNode.php | 24 + vendor/twig/twig/src/Node/CaptureNode.php | 57 + .../twig/src/Node/CheckSecurityCallNode.php | 32 + .../twig/twig/src/Node/CheckSecurityNode.php | 109 + .../twig/twig/src/Node/CheckToStringNode.php | 48 + .../Node/CoercesChildrenToStringInterface.php | 40 + vendor/twig/twig/src/Node/ConfigNode.php | 30 + vendor/twig/twig/src/Node/DeprecatedNode.php | 87 + vendor/twig/twig/src/Node/DoNode.php | 40 + vendor/twig/twig/src/Node/EmbedNode.php | 54 + vendor/twig/twig/src/Node/EmptyNode.php | 33 + .../Node/Expression/AbstractExpression.php | 43 + .../src/Node/Expression/ArrayExpression.php | 165 + .../Expression/ArrowFunctionExpression.php | 63 + .../Node/Expression/AssignNameExpression.php | 44 + .../Node/Expression/Binary/AbstractBinary.php | 53 + .../src/Node/Expression/Binary/AddBinary.php | 24 + .../src/Node/Expression/Binary/AndBinary.php | 31 + .../Expression/Binary/BinaryInterface.php | 22 + .../Expression/Binary/BitwiseAndBinary.php | 24 + .../Expression/Binary/BitwiseOrBinary.php | 24 + .../Expression/Binary/BitwiseXorBinary.php | 24 + .../Node/Expression/Binary/ConcatBinary.php | 30 + .../src/Node/Expression/Binary/DivBinary.php | 24 + .../Node/Expression/Binary/ElvisBinary.php | 56 + .../Node/Expression/Binary/EndsWithBinary.php | 36 + .../Node/Expression/Binary/EqualBinary.php | 46 + .../Node/Expression/Binary/FloorDivBinary.php | 30 + .../Node/Expression/Binary/GreaterBinary.php | 46 + .../Expression/Binary/GreaterEqualBinary.php | 46 + .../Node/Expression/Binary/HasEveryBinary.php | 34 + .../Node/Expression/Binary/HasSomeBinary.php | 34 + .../src/Node/Expression/Binary/InBinary.php | 40 + .../src/Node/Expression/Binary/LessBinary.php | 46 + .../Expression/Binary/LessEqualBinary.php | 46 + .../Node/Expression/Binary/MatchesBinary.php | 66 + .../src/Node/Expression/Binary/ModBinary.php | 24 + .../src/Node/Expression/Binary/MulBinary.php | 24 + .../Node/Expression/Binary/NotEqualBinary.php | 46 + .../Node/Expression/Binary/NotInBinary.php | 40 + .../Expression/Binary/NotSameAsBinary.php | 23 + .../Expression/Binary/NullCoalesceBinary.php | 71 + .../Binary/ObjectDestructuringSetBinary.php | 77 + .../src/Node/Expression/Binary/OrBinary.php | 31 + .../Node/Expression/Binary/PowerBinary.php | 23 + .../Node/Expression/Binary/RangeBinary.php | 40 + .../Node/Expression/Binary/SameAsBinary.php | 23 + .../Binary/SequenceDestructuringSetBinary.php | 67 + .../src/Node/Expression/Binary/SetBinary.php | 44 + .../Expression/Binary/SpaceshipBinary.php | 29 + .../Expression/Binary/StartsWithBinary.php | 36 + .../src/Node/Expression/Binary/SubBinary.php | 24 + .../src/Node/Expression/Binary/XorBinary.php | 31 + .../Expression/BlockReferenceExpression.php | 102 + .../src/Node/Expression/CallExpression.php | 375 ++ .../Node/Expression/ConditionalExpression.php | 53 + .../Node/Expression/ConstantExpression.php | 33 + .../src/Node/Expression/EmptyExpression.php | 33 + .../Node/Expression/Filter/DefaultFilter.php | 72 + .../src/Node/Expression/Filter/RawFilter.php | 45 + .../src/Node/Expression/FilterExpression.php | 87 + .../Node/Expression/FunctionExpression.php | 88 + .../FunctionNode/EnumCasesFunction.php | 50 + .../Expression/FunctionNode/EnumFunction.php | 54 + .../src/Node/Expression/GetAttrExpression.php | 228 + .../twig/src/Node/Expression/InlinePrint.php | 39 + .../src/Node/Expression/ListExpression.php | 41 + .../Expression/MacroReferenceExpression.php | 136 + .../Node/Expression/MethodCallExpression.php | 58 + .../src/Node/Expression/NameExpression.php | 115 + .../Expression/NullCoalesceExpression.php | 77 + .../Expression/OperatorEscapeInterface.php | 25 + .../src/Node/Expression/ParentExpression.php | 46 + .../Node/Expression/ReturnArrayInterface.php | 16 + .../Node/Expression/ReturnBoolInterface.php | 16 + .../Node/Expression/ReturnNumberInterface.php | 16 + .../ReturnPrimitiveTypeInterface.php | 16 + .../Node/Expression/ReturnStringInterface.php | 16 + .../SupportDefinedTestDeprecationTrait.php | 44 + .../SupportDefinedTestInterface.php | 24 + .../Expression/SupportDefinedTestTrait.php | 27 + .../Node/Expression/TempNameExpression.php | 49 + .../Expression/Ternary/ConditionalTernary.php | 43 + .../src/Node/Expression/Test/ConstantTest.php | 49 + .../src/Node/Expression/Test/DefinedTest.php | 68 + .../Node/Expression/Test/DivisiblebyTest.php | 42 + .../src/Node/Expression/Test/EvenTest.php | 41 + .../src/Node/Expression/Test/NullTest.php | 40 + .../twig/src/Node/Expression/Test/OddTest.php | 41 + .../src/Node/Expression/Test/SameasTest.php | 40 + .../src/Node/Expression/Test/TrueTest.php | 52 + .../src/Node/Expression/TestExpression.php | 91 + .../Node/Expression/Unary/AbstractUnary.php | 48 + .../src/Node/Expression/Unary/NegUnary.php | 23 + .../src/Node/Expression/Unary/NotUnary.php | 31 + .../src/Node/Expression/Unary/PosUnary.php | 23 + .../src/Node/Expression/Unary/SpreadUnary.php | 22 + .../Node/Expression/Unary/StringCastUnary.php | 22 + .../Node/Expression/Unary/UnaryInterface.php | 22 + .../Variable/AssignContextVariable.php | 18 + .../Variable/AssignTemplateVariable.php | 44 + .../Expression/Variable/ContextVariable.php | 18 + .../Expression/Variable/LocalVariable.php | 18 + .../Expression/Variable/TemplateVariable.php | 42 + .../Node/Expression/VariadicExpression.php | 24 + vendor/twig/twig/src/Node/FlushNode.php | 40 + vendor/twig/twig/src/Node/ForElseNode.php | 41 + vendor/twig/twig/src/Node/ForLoopNode.php | 51 + vendor/twig/twig/src/Node/ForNode.php | 123 + vendor/twig/twig/src/Node/IfNode.php | 79 + vendor/twig/twig/src/Node/ImportNode.php | 67 + vendor/twig/twig/src/Node/IncludeNode.php | 121 + vendor/twig/twig/src/Node/MacroNode.php | 121 + vendor/twig/twig/src/Node/ModuleNode.php | 522 ++ vendor/twig/twig/src/Node/NameDeprecation.php | 46 + vendor/twig/twig/src/Node/Node.php | 294 ++ .../twig/src/Node/NodeCaptureInterface.php | 21 + .../twig/src/Node/NodeOutputInterface.php | 21 + vendor/twig/twig/src/Node/Nodes.php | 28 + vendor/twig/twig/src/Node/PrintNode.php | 69 + vendor/twig/twig/src/Node/SandboxNode.php | 54 + vendor/twig/twig/src/Node/SetNode.php | 115 + vendor/twig/twig/src/Node/TextNode.php | 57 + vendor/twig/twig/src/Node/TypesNode.php | 40 + vendor/twig/twig/src/Node/WithNode.php | 72 + vendor/twig/twig/src/NodeTraverser.php | 76 + .../src/NodeVisitor/AbstractNodeVisitor.php | 49 + .../NodeVisitor/CorrectnessNodeVisitor.php | 223 + .../src/NodeVisitor/EscaperNodeVisitor.php | 185 + .../src/NodeVisitor/NodeVisitorInterface.php | 46 + .../src/NodeVisitor/OptimizerNodeVisitor.php | 213 + .../NodeVisitor/SafeAnalysisNodeVisitor.php | 185 + .../src/NodeVisitor/SandboxNodeVisitor.php | 295 ++ .../NodeVisitor/YieldNotReadyNodeVisitor.php | 59 + .../twig/src/OperatorPrecedenceChange.php | 34 + vendor/twig/twig/src/Parser.php | 612 +++ .../twig/src/Profiler/Dumper/BaseDumper.php | 68 + .../src/Profiler/Dumper/BlackfireDumper.php | 72 + .../twig/src/Profiler/Dumper/HtmlDumper.php | 57 + .../twig/src/Profiler/Dumper/TextDumper.php | 35 + .../src/Profiler/Node/EnterProfileNode.php | 44 + .../src/Profiler/Node/LeaveProfileNode.php | 38 + .../NodeVisitor/ProfilerNodeVisitor.php | 70 + vendor/twig/twig/src/Profiler/Profile.php | 194 + vendor/twig/twig/src/Resources/core.php | 572 +++ vendor/twig/twig/src/Resources/debug.php | 25 + vendor/twig/twig/src/Resources/escaper.php | 51 + .../twig/twig/src/Resources/string_loader.php | 26 + .../twig/twig/src/Runtime/EscaperRuntime.php | 346 ++ .../RuntimeLoader/ContainerRuntimeLoader.php | 35 + .../RuntimeLoader/FactoryRuntimeLoader.php | 39 + .../RuntimeLoader/RuntimeLoaderInterface.php | 27 + .../twig/twig/src/Sandbox/SecurityError.php | 23 + .../Sandbox/SecurityNotAllowedFilterError.php | 33 + .../SecurityNotAllowedFunctionError.php | 33 + .../Sandbox/SecurityNotAllowedMethodError.php | 40 + .../SecurityNotAllowedPropertyError.php | 40 + .../Sandbox/SecurityNotAllowedTagError.php | 33 + .../Sandbox/SecurityNotAllowedTestError.php | 33 + .../twig/twig/src/Sandbox/SecurityPolicy.php | 175 + .../src/Sandbox/SecurityPolicyInterface.php | 46 + .../src/Sandbox/SourcePolicyInterface.php | 26 + vendor/twig/twig/src/Source.php | 66 + vendor/twig/twig/src/Template.php | 560 +++ vendor/twig/twig/src/TemplateWrapper.php | 112 + .../twig/src/Test/IntegrationTestCase.php | 380 ++ vendor/twig/twig/src/Test/NodeTestCase.php | 144 + vendor/twig/twig/src/Token.php | 256 + .../src/TokenParser/AbstractTokenParser.php | 66 + .../twig/src/TokenParser/ApplyTokenParser.php | 66 + .../src/TokenParser/AutoEscapeTokenParser.php | 58 + .../twig/src/TokenParser/BlockTokenParser.php | 77 + .../src/TokenParser/DeprecatedTokenParser.php | 65 + .../twig/src/TokenParser/DoTokenParser.php | 38 + .../twig/src/TokenParser/EmbedTokenParser.php | 73 + .../src/TokenParser/ExtendsTokenParser.php | 41 + .../twig/src/TokenParser/FlushTokenParser.php | 38 + .../twig/src/TokenParser/ForTokenParser.php | 80 + .../twig/src/TokenParser/FromTokenParser.php | 69 + .../twig/src/TokenParser/GuardTokenParser.php | 79 + .../twig/src/TokenParser/IfTokenParser.php | 90 + .../src/TokenParser/ImportTokenParser.php | 45 + .../src/TokenParser/IncludeTokenParser.php | 73 + .../twig/src/TokenParser/MacroTokenParser.php | 123 + .../src/TokenParser/SandboxTokenParser.php | 72 + .../twig/src/TokenParser/SetTokenParser.php | 87 + .../src/TokenParser/TokenParserInterface.php | 48 + .../twig/src/TokenParser/TypesTokenParser.php | 89 + .../twig/src/TokenParser/UseTokenParser.php | 75 + .../twig/src/TokenParser/WithTokenParser.php | 56 + vendor/twig/twig/src/TokenStream.php | 132 + .../twig/twig/src/TwigCallableInterface.php | 56 + vendor/twig/twig/src/TwigFilter.php | 74 + vendor/twig/twig/src/TwigFunction.php | 63 + vendor/twig/twig/src/TwigTest.php | 67 + .../src/Util/CallableArgumentsExtractor.php | 204 + .../twig/twig/src/Util/CallableParameters.php | 161 + .../twig/src/Util/DeprecationCollector.php | 77 + .../twig/twig/src/Util/ReflectionCallable.php | 131 + .../twig/src/Util/TemplateDirIterator.php | 36 + 833 files changed, 108974 insertions(+), 1386 deletions(-) create mode 100644 admin/templates/pages/theme-new.php create mode 100644 cms/core/class/LogManager.php create mode 100644 cms/core/class/ThemeManager.php delete mode 100644 cms/templates/html_content.mustache delete mode 100644 cms/templates/layout.mustache delete mode 100644 cms/templates/markdown_content.mustache delete mode 100644 cms/templates/php_content.mustache delete mode 100644 plugins/test/README.md delete mode 100644 plugins/test/config.json delete mode 100644 plugins/test/test.php delete mode 100644 public/themes/test_bg.jpg create mode 100644 themes/default/base.twig create mode 100644 themes/default/css/theme.scss create mode 100644 themes/default/custom1.twig create mode 100644 themes/default/full_content.twig create mode 100644 themes/default/js/theme.js create mode 100644 themes/default/left_sidebar.twig rename cms/templates/assets/footer.mustache => themes/default/partials/footer.twig (61%) rename cms/templates/assets/header.mustache => themes/default/partials/header.twig (63%) rename cms/templates/assets/navigation.mustache => themes/default/partials/navigation.twig (69%) create mode 100644 themes/default/right_sidebar.twig create mode 100644 themes/default/theme.png create mode 100644 themes/demo/base.twig create mode 100644 themes/demo/css/theme.scss create mode 100644 themes/demo/custom1.twig create mode 100644 themes/demo/full_content.twig create mode 100644 themes/demo/js/theme.js create mode 100644 themes/demo/left_sidebar.twig create mode 100644 themes/demo/partials/footer.twig create mode 100644 themes/demo/partials/header.twig create mode 100644 themes/demo/partials/navigation.twig create mode 100644 themes/demo/right_sidebar.twig create mode 100644 themes/demo/theme.json create mode 100644 themes/demo/theme.png create mode 100755 themes/gen-preview.sh delete mode 100644 themes/test/theme.json create mode 100644 vendor/composer/ca-bundle/LICENSE create mode 100644 vendor/composer/ca-bundle/README.md create mode 100644 vendor/composer/ca-bundle/composer.json create mode 100644 vendor/composer/ca-bundle/res/cacert.pem create mode 100644 vendor/composer/ca-bundle/src/CaBundle.php create mode 100644 vendor/geoip2/geoip2/CHANGELOG.md create mode 100644 vendor/geoip2/geoip2/LICENSE create mode 100644 vendor/geoip2/geoip2/README.md create mode 100644 vendor/geoip2/geoip2/composer.json create mode 100644 vendor/geoip2/geoip2/examples/benchmark.php create mode 100644 vendor/geoip2/geoip2/src/Database/Reader.php create mode 100644 vendor/geoip2/geoip2/src/Exception/AddressNotFoundException.php create mode 100644 vendor/geoip2/geoip2/src/Exception/AuthenticationException.php create mode 100644 vendor/geoip2/geoip2/src/Exception/GeoIp2Exception.php create mode 100644 vendor/geoip2/geoip2/src/Exception/HttpException.php create mode 100644 vendor/geoip2/geoip2/src/Exception/InvalidRequestException.php create mode 100644 vendor/geoip2/geoip2/src/Exception/OutOfQueriesException.php create mode 100644 vendor/geoip2/geoip2/src/Model/AbstractModel.php create mode 100644 vendor/geoip2/geoip2/src/Model/AnonymousIp.php create mode 100644 vendor/geoip2/geoip2/src/Model/Asn.php create mode 100644 vendor/geoip2/geoip2/src/Model/City.php create mode 100644 vendor/geoip2/geoip2/src/Model/ConnectionType.php create mode 100644 vendor/geoip2/geoip2/src/Model/Country.php create mode 100644 vendor/geoip2/geoip2/src/Model/Domain.php create mode 100644 vendor/geoip2/geoip2/src/Model/Enterprise.php create mode 100644 vendor/geoip2/geoip2/src/Model/Insights.php create mode 100644 vendor/geoip2/geoip2/src/Model/Isp.php create mode 100644 vendor/geoip2/geoip2/src/ProviderInterface.php create mode 100644 vendor/geoip2/geoip2/src/Record/AbstractPlaceRecord.php create mode 100644 vendor/geoip2/geoip2/src/Record/AbstractRecord.php create mode 100644 vendor/geoip2/geoip2/src/Record/City.php create mode 100644 vendor/geoip2/geoip2/src/Record/Continent.php create mode 100644 vendor/geoip2/geoip2/src/Record/Country.php create mode 100644 vendor/geoip2/geoip2/src/Record/Location.php create mode 100644 vendor/geoip2/geoip2/src/Record/MaxMind.php create mode 100644 vendor/geoip2/geoip2/src/Record/Postal.php create mode 100644 vendor/geoip2/geoip2/src/Record/RepresentedCountry.php create mode 100644 vendor/geoip2/geoip2/src/Record/Subdivision.php create mode 100644 vendor/geoip2/geoip2/src/Record/Traits.php create mode 100644 vendor/geoip2/geoip2/src/Util.php create mode 100644 vendor/geoip2/geoip2/src/WebService/Client.php create mode 100644 vendor/league/uri-interfaces/Contracts/AuthorityInterface.php create mode 100644 vendor/league/uri-interfaces/Contracts/Conditionable.php create mode 100644 vendor/league/uri-interfaces/Contracts/DataPathInterface.php create mode 100644 vendor/league/uri-interfaces/Contracts/DomainHostInterface.php create mode 100644 vendor/league/uri-interfaces/Contracts/FragmentDirective.php create mode 100644 vendor/league/uri-interfaces/Contracts/FragmentInterface.php create mode 100644 vendor/league/uri-interfaces/Contracts/HostInterface.php create mode 100644 vendor/league/uri-interfaces/Contracts/IpHostInterface.php create mode 100644 vendor/league/uri-interfaces/Contracts/PathInterface.php create mode 100644 vendor/league/uri-interfaces/Contracts/PortInterface.php create mode 100644 vendor/league/uri-interfaces/Contracts/QueryInterface.php create mode 100644 vendor/league/uri-interfaces/Contracts/SegmentedPathInterface.php create mode 100644 vendor/league/uri-interfaces/Contracts/Transformable.php create mode 100644 vendor/league/uri-interfaces/Contracts/UriAccess.php create mode 100644 vendor/league/uri-interfaces/Contracts/UriComponentInterface.php create mode 100644 vendor/league/uri-interfaces/Contracts/UriException.php create mode 100644 vendor/league/uri-interfaces/Contracts/UriInterface.php create mode 100644 vendor/league/uri-interfaces/Contracts/UserInfoInterface.php create mode 100644 vendor/league/uri-interfaces/Encoder.php create mode 100644 vendor/league/uri-interfaces/Exceptions/ConversionFailed.php create mode 100644 vendor/league/uri-interfaces/Exceptions/MissingFeature.php create mode 100644 vendor/league/uri-interfaces/Exceptions/OffsetOutOfBounds.php create mode 100644 vendor/league/uri-interfaces/Exceptions/SyntaxError.php create mode 100644 vendor/league/uri-interfaces/FeatureDetection.php create mode 100644 vendor/league/uri-interfaces/HostFormat.php create mode 100644 vendor/league/uri-interfaces/HostRecord.php create mode 100644 vendor/league/uri-interfaces/HostType.php create mode 100644 vendor/league/uri-interfaces/IPv4/BCMathCalculator.php create mode 100644 vendor/league/uri-interfaces/IPv4/Calculator.php create mode 100644 vendor/league/uri-interfaces/IPv4/Converter.php create mode 100644 vendor/league/uri-interfaces/IPv4/GMPCalculator.php create mode 100644 vendor/league/uri-interfaces/IPv4/NativeCalculator.php create mode 100644 vendor/league/uri-interfaces/IPv6/Converter.php create mode 100644 vendor/league/uri-interfaces/Idna/Converter.php create mode 100644 vendor/league/uri-interfaces/Idna/Error.php create mode 100644 vendor/league/uri-interfaces/Idna/Option.php create mode 100644 vendor/league/uri-interfaces/Idna/Result.php create mode 100644 vendor/league/uri-interfaces/KeyValuePair/Converter.php create mode 100644 vendor/league/uri-interfaces/LICENSE create mode 100644 vendor/league/uri-interfaces/QueryComposeMode.php create mode 100644 vendor/league/uri-interfaces/QueryExtractMode.php create mode 100644 vendor/league/uri-interfaces/QueryString.php create mode 100644 vendor/league/uri-interfaces/StringCoercionMode.php create mode 100644 vendor/league/uri-interfaces/UriComparisonMode.php create mode 100644 vendor/league/uri-interfaces/UriString.php create mode 100644 vendor/league/uri-interfaces/UrnComparisonMode.php create mode 100644 vendor/league/uri-interfaces/composer.json create mode 100644 vendor/league/uri/BaseUri.php create mode 100644 vendor/league/uri/Builder.php create mode 100644 vendor/league/uri/Http.php create mode 100644 vendor/league/uri/HttpFactory.php create mode 100644 vendor/league/uri/LICENSE create mode 100644 vendor/league/uri/SchemeType.php create mode 100644 vendor/league/uri/Uri.php create mode 100644 vendor/league/uri/UriInfo.php create mode 100644 vendor/league/uri/UriResolver.php create mode 100644 vendor/league/uri/UriScheme.php create mode 100644 vendor/league/uri/UriTemplate.php create mode 100644 vendor/league/uri/UriTemplate/Expression.php create mode 100644 vendor/league/uri/UriTemplate/Operator.php create mode 100644 vendor/league/uri/UriTemplate/Template.php create mode 100644 vendor/league/uri/UriTemplate/TemplateCanNotBeExpanded.php create mode 100644 vendor/league/uri/UriTemplate/VarSpecifier.php create mode 100644 vendor/league/uri/UriTemplate/VariableBag.php create mode 100644 vendor/league/uri/Urn.php create mode 100644 vendor/league/uri/composer.json create mode 100644 vendor/maxmind-db/reader/CHANGELOG.md create mode 100644 vendor/maxmind-db/reader/LICENSE create mode 100644 vendor/maxmind-db/reader/README.md create mode 100644 vendor/maxmind-db/reader/autoload.php create mode 100644 vendor/maxmind-db/reader/composer.json create mode 100644 vendor/maxmind-db/reader/ext/config.m4 create mode 100644 vendor/maxmind-db/reader/ext/config.w32 create mode 100644 vendor/maxmind-db/reader/ext/maxminddb.c create mode 100644 vendor/maxmind-db/reader/ext/php_maxminddb.h create mode 100644 vendor/maxmind-db/reader/ext/tests/001-load.phpt create mode 100644 vendor/maxmind-db/reader/ext/tests/002-final.phpt create mode 100644 vendor/maxmind-db/reader/ext/tests/003-open-basedir.phpt create mode 100644 vendor/maxmind-db/reader/package.xml create mode 100644 vendor/maxmind-db/reader/src/MaxMind/Db/Reader.php create mode 100644 vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Decoder.php create mode 100644 vendor/maxmind-db/reader/src/MaxMind/Db/Reader/InvalidDatabaseException.php create mode 100644 vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Metadata.php create mode 100644 vendor/maxmind-db/reader/src/MaxMind/Db/Reader/Util.php create mode 100644 vendor/maxmind/web-service-common/CHANGELOG.md create mode 100644 vendor/maxmind/web-service-common/LICENSE create mode 100644 vendor/maxmind/web-service-common/README.md create mode 100644 vendor/maxmind/web-service-common/composer.json create mode 100755 vendor/maxmind/web-service-common/dev-bin/release.sh create mode 100644 vendor/maxmind/web-service-common/phpstan.neon create mode 100644 vendor/maxmind/web-service-common/src/Exception/AuthenticationException.php create mode 100644 vendor/maxmind/web-service-common/src/Exception/HttpException.php create mode 100644 vendor/maxmind/web-service-common/src/Exception/InsufficientFundsException.php create mode 100644 vendor/maxmind/web-service-common/src/Exception/InvalidInputException.php create mode 100644 vendor/maxmind/web-service-common/src/Exception/InvalidRequestException.php create mode 100644 vendor/maxmind/web-service-common/src/Exception/IpAddressNotFoundException.php create mode 100644 vendor/maxmind/web-service-common/src/Exception/PermissionRequiredException.php create mode 100644 vendor/maxmind/web-service-common/src/Exception/WebServiceException.php create mode 100644 vendor/maxmind/web-service-common/src/WebService/Client.php create mode 100644 vendor/maxmind/web-service-common/src/WebService/Http/CurlRequest.php create mode 100644 vendor/maxmind/web-service-common/src/WebService/Http/Request.php create mode 100644 vendor/maxmind/web-service-common/src/WebService/Http/RequestFactory.php create mode 100644 vendor/psr/http-factory/LICENSE create mode 100644 vendor/psr/http-factory/README.md create mode 100644 vendor/psr/http-factory/composer.json create mode 100644 vendor/psr/http-factory/src/RequestFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/ResponseFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/ServerRequestFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/StreamFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/UploadedFileFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/UriFactoryInterface.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/docs/PSR7-Interfaces.md create mode 100644 vendor/psr/http-message/docs/PSR7-Usage.md 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/scssphp/scssphp/LICENSE.md create mode 100644 vendor/scssphp/scssphp/README.md create mode 100644 vendor/scssphp/scssphp/composer.json create mode 100644 vendor/scssphp/scssphp/src/Ast/AstNode.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/CssAtRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/CssComment.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/CssDeclaration.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/CssImport.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/CssKeyframeBlock.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/CssMediaQuery.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/CssMediaRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/CssNode.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/CssParentNode.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/CssStyleRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/CssStylesheet.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/CssSupportsRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/CssValue.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/IsInvisibleVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/MediaQueryMergeResult.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/MediaQuerySingletonMergeResult.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssAtRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssComment.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssDeclaration.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssImport.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssKeyframeBlock.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssMediaRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssNode.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssParentNode.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssStyleRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssStylesheet.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Css/ModifiableCssSupportsRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/FakeAstNode.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Argument.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/ArgumentDeclaration.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/ArgumentInvocation.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/AtRootQuery.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/CallableInvocation.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/ConfiguredVariable.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/BinaryOperationExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/BinaryOperator.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/BooleanExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/ColorExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/FunctionExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/IfExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/InterpolatedFunctionExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/IsCalculationSafeVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/ListExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/MapExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/NullExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/NumberExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/ParenthesizedExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/SelectorExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/StringExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/SupportsExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/UnaryOperationExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/UnaryOperator.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/ValueExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Expression/VariableExpression.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Import.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Import/DynamicImport.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Import/StaticImport.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Interpolation.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/SassDeclaration.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/SassNode.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/SassReference.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/AtRootRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/AtRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/CallableDeclaration.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/ContentBlock.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/ContentRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/DebugRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/Declaration.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/EachRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/ElseClause.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/ErrorRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/ExtendRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/ForRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/FunctionRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/HasContentVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/IfClause.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/IfRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/IfRuleClause.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/ImportRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/IncludeRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/LoudComment.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/MediaRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/MixinRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/ParentStatement.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/ReturnRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/SilentComment.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/StyleRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/Stylesheet.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/SupportsRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/VariableDeclaration.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/WarnRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/Statement/WhileRule.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition/SupportsAnything.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition/SupportsDeclaration.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition/SupportsFunction.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition/SupportsInterpolation.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition/SupportsNegation.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Sass/SupportsCondition/SupportsOperation.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/AttributeOperator.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/AttributeSelector.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/ClassSelector.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/Combinator.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/ComplexSelector.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/ComplexSelectorComponent.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/CompoundSelector.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/IDSelector.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/IsBogusVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/IsInvisibleVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/IsUselessVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/ParentSelector.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/ParentSelectorVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/PlaceholderSelector.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/PseudoSelector.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/QualifiedName.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/Selector.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/SelectorList.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/SimpleSelector.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/TypeSelector.php create mode 100644 vendor/scssphp/scssphp/src/Ast/Selector/UniversalSelector.php create mode 100644 vendor/scssphp/scssphp/src/Collection/Map.php create mode 100644 vendor/scssphp/scssphp/src/Colors.php create mode 100644 vendor/scssphp/scssphp/src/CompilationResult.php create mode 100644 vendor/scssphp/scssphp/src/Compiler.php create mode 100644 vendor/scssphp/scssphp/src/Compiler/LegacyValueVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Deprecation.php create mode 100644 vendor/scssphp/scssphp/src/DeprecationStatus.php create mode 100644 vendor/scssphp/scssphp/src/Evaluation/ArgumentResults.php create mode 100644 vendor/scssphp/scssphp/src/Evaluation/Environment.php create mode 100644 vendor/scssphp/scssphp/src/Evaluation/EvaluateResult.php create mode 100644 vendor/scssphp/scssphp/src/Evaluation/EvaluateVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Evaluation/EvaluationContext.php create mode 100644 vendor/scssphp/scssphp/src/Evaluation/LoadedStylesheet.php create mode 100644 vendor/scssphp/scssphp/src/Evaluation/VisitorEvaluationContext.php create mode 100644 vendor/scssphp/scssphp/src/Exception/MultiSpanSassException.php create mode 100644 vendor/scssphp/scssphp/src/Exception/MultiSpanSassFormatException.php create mode 100644 vendor/scssphp/scssphp/src/Exception/MultiSpanSassRuntimeException.php create mode 100644 vendor/scssphp/scssphp/src/Exception/MultiSpanSassScriptException.php create mode 100644 vendor/scssphp/scssphp/src/Exception/SassException.php create mode 100644 vendor/scssphp/scssphp/src/Exception/SassFormatException.php create mode 100644 vendor/scssphp/scssphp/src/Exception/SassRuntimeException.php create mode 100644 vendor/scssphp/scssphp/src/Exception/SassScriptException.php create mode 100644 vendor/scssphp/scssphp/src/Exception/SimpleSassException.php create mode 100644 vendor/scssphp/scssphp/src/Exception/SimpleSassFormatException.php create mode 100644 vendor/scssphp/scssphp/src/Exception/SimpleSassRuntimeException.php create mode 100644 vendor/scssphp/scssphp/src/Extend/ComplexSelectorMap.php create mode 100644 vendor/scssphp/scssphp/src/Extend/ConcreteExtensionStore.php create mode 100644 vendor/scssphp/scssphp/src/Extend/EmptyExtensionStore.php create mode 100644 vendor/scssphp/scssphp/src/Extend/ExtendMode.php create mode 100644 vendor/scssphp/scssphp/src/Extend/ExtendUtil.php create mode 100644 vendor/scssphp/scssphp/src/Extend/Extender.php create mode 100644 vendor/scssphp/scssphp/src/Extend/Extension.php create mode 100644 vendor/scssphp/scssphp/src/Extend/ExtensionStore.php create mode 100644 vendor/scssphp/scssphp/src/Extend/MergedExtension.php create mode 100644 vendor/scssphp/scssphp/src/Extend/ObjectSet.php create mode 100644 vendor/scssphp/scssphp/src/Extend/SimpleSelectorMap.php create mode 100644 vendor/scssphp/scssphp/src/Function/ColorFunctions.php create mode 100644 vendor/scssphp/scssphp/src/Function/FunctionRegistry.php create mode 100644 vendor/scssphp/scssphp/src/Function/ListFunctions.php create mode 100644 vendor/scssphp/scssphp/src/Function/MapFunctions.php create mode 100644 vendor/scssphp/scssphp/src/Function/MathFunctions.php create mode 100644 vendor/scssphp/scssphp/src/Function/MetaFunctions.php create mode 100644 vendor/scssphp/scssphp/src/Function/SelectorFunctions.php create mode 100644 vendor/scssphp/scssphp/src/Function/StringFunctions.php create mode 100644 vendor/scssphp/scssphp/src/Importer/CanonicalizeContext.php create mode 100644 vendor/scssphp/scssphp/src/Importer/CanonicalizeResult.php create mode 100644 vendor/scssphp/scssphp/src/Importer/FilesystemImporter.php create mode 100644 vendor/scssphp/scssphp/src/Importer/ImportCache.php create mode 100644 vendor/scssphp/scssphp/src/Importer/ImportContext.php create mode 100644 vendor/scssphp/scssphp/src/Importer/ImportUtil.php create mode 100644 vendor/scssphp/scssphp/src/Importer/Importer.php create mode 100644 vendor/scssphp/scssphp/src/Importer/ImporterResult.php create mode 100644 vendor/scssphp/scssphp/src/Importer/LegacyCallbackImporter.php create mode 100644 vendor/scssphp/scssphp/src/Importer/NoOpImporter.php create mode 100644 vendor/scssphp/scssphp/src/Importer/SpecialCacheValue.php create mode 100644 vendor/scssphp/scssphp/src/Logger/DeprecationProcessingLogger.php create mode 100644 vendor/scssphp/scssphp/src/Logger/LoggerInterface.php create mode 100644 vendor/scssphp/scssphp/src/Logger/QuietLogger.php create mode 100644 vendor/scssphp/scssphp/src/Logger/StreamLogger.php create mode 100644 vendor/scssphp/scssphp/src/Node.php create mode 100644 vendor/scssphp/scssphp/src/Node/Number.php create mode 100644 vendor/scssphp/scssphp/src/OutputStyle.php create mode 100644 vendor/scssphp/scssphp/src/Parser/AtRootQueryParser.php create mode 100644 vendor/scssphp/scssphp/src/Parser/CssParser.php create mode 100644 vendor/scssphp/scssphp/src/Parser/FormatException.php create mode 100644 vendor/scssphp/scssphp/src/Parser/InterpolationBuffer.php create mode 100644 vendor/scssphp/scssphp/src/Parser/InterpolationMap.php create mode 100644 vendor/scssphp/scssphp/src/Parser/KeyframeSelectorParser.php create mode 100644 vendor/scssphp/scssphp/src/Parser/LineScanner.php create mode 100644 vendor/scssphp/scssphp/src/Parser/MediaQueryParser.php create mode 100644 vendor/scssphp/scssphp/src/Parser/MultiSourceFormatException.php create mode 100644 vendor/scssphp/scssphp/src/Parser/Parser.php create mode 100644 vendor/scssphp/scssphp/src/Parser/SassParser.php create mode 100644 vendor/scssphp/scssphp/src/Parser/ScssParser.php create mode 100644 vendor/scssphp/scssphp/src/Parser/SelectorParser.php create mode 100644 vendor/scssphp/scssphp/src/Parser/StringScanner.php create mode 100644 vendor/scssphp/scssphp/src/Parser/StylesheetParser.php create mode 100644 vendor/scssphp/scssphp/src/SassCallable/BuiltInCallable.php create mode 100644 vendor/scssphp/scssphp/src/SassCallable/PlainCssCallable.php create mode 100644 vendor/scssphp/scssphp/src/SassCallable/SassCallable.php create mode 100644 vendor/scssphp/scssphp/src/SassCallable/UserDefinedCallable.php create mode 100644 vendor/scssphp/scssphp/src/Serializer/SerializeResult.php create mode 100644 vendor/scssphp/scssphp/src/Serializer/SerializeVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Serializer/Serializer.php create mode 100644 vendor/scssphp/scssphp/src/Serializer/SimpleStringBuffer.php create mode 100644 vendor/scssphp/scssphp/src/Serializer/SourceMapBuffer.php create mode 100644 vendor/scssphp/scssphp/src/Serializer/StringBuffer.php create mode 100644 vendor/scssphp/scssphp/src/Serializer/TrackingSourceMapBuffer.php create mode 100644 vendor/scssphp/scssphp/src/SourceMap/Base64.php create mode 100644 vendor/scssphp/scssphp/src/SourceMap/Base64VLQ.php create mode 100644 vendor/scssphp/scssphp/src/SourceMap/Builder/Entry.php create mode 100644 vendor/scssphp/scssphp/src/SourceMap/SingleMapping.php create mode 100644 vendor/scssphp/scssphp/src/SourceMap/TargetEntry.php create mode 100644 vendor/scssphp/scssphp/src/SourceMap/TargetLineEntry.php create mode 100644 vendor/scssphp/scssphp/src/SourceSpan/LazyFileSpan.php create mode 100644 vendor/scssphp/scssphp/src/SourceSpan/MultiSpan.php create mode 100644 vendor/scssphp/scssphp/src/StackTrace/Frame.php create mode 100644 vendor/scssphp/scssphp/src/StackTrace/Trace.php create mode 100644 vendor/scssphp/scssphp/src/Syntax.php create mode 100644 vendor/scssphp/scssphp/src/Type.php create mode 100644 vendor/scssphp/scssphp/src/Util.php create mode 100644 vendor/scssphp/scssphp/src/Util/ArrayUtil.php create mode 100644 vendor/scssphp/scssphp/src/Util/AstUtil.php create mode 100644 vendor/scssphp/scssphp/src/Util/Box.php create mode 100644 vendor/scssphp/scssphp/src/Util/Character.php create mode 100644 vendor/scssphp/scssphp/src/Util/Equatable.php create mode 100644 vendor/scssphp/scssphp/src/Util/EquatableUtil.php create mode 100644 vendor/scssphp/scssphp/src/Util/ErrorUtil.php create mode 100644 vendor/scssphp/scssphp/src/Util/IterableUtil.php create mode 100644 vendor/scssphp/scssphp/src/Util/ListUtil.php create mode 100644 vendor/scssphp/scssphp/src/Util/LoggerUtil.php create mode 100644 vendor/scssphp/scssphp/src/Util/MakeExpressionCalculationSafe.php create mode 100644 vendor/scssphp/scssphp/src/Util/ModifiableBox.php create mode 100644 vendor/scssphp/scssphp/src/Util/NumberUtil.php create mode 100644 vendor/scssphp/scssphp/src/Util/ParserUtil.php create mode 100644 vendor/scssphp/scssphp/src/Util/Path.php create mode 100644 vendor/scssphp/scssphp/src/Util/SpanUtil.php create mode 100644 vendor/scssphp/scssphp/src/Util/StringUtil.php create mode 100644 vendor/scssphp/scssphp/src/Util/UriUtil.php create mode 100644 vendor/scssphp/scssphp/src/Value/CalculationOperation.php create mode 100644 vendor/scssphp/scssphp/src/Value/CalculationOperator.php create mode 100644 vendor/scssphp/scssphp/src/Value/ColorFormat.php create mode 100644 vendor/scssphp/scssphp/src/Value/ColorFormatEnum.php create mode 100644 vendor/scssphp/scssphp/src/Value/ComplexSassNumber.php create mode 100644 vendor/scssphp/scssphp/src/Value/ListSeparator.php create mode 100644 vendor/scssphp/scssphp/src/Value/SassArgumentList.php create mode 100644 vendor/scssphp/scssphp/src/Value/SassBoolean.php create mode 100644 vendor/scssphp/scssphp/src/Value/SassCalculation.php create mode 100644 vendor/scssphp/scssphp/src/Value/SassColor.php create mode 100644 vendor/scssphp/scssphp/src/Value/SassFunction.php create mode 100644 vendor/scssphp/scssphp/src/Value/SassList.php create mode 100644 vendor/scssphp/scssphp/src/Value/SassMap.php create mode 100644 vendor/scssphp/scssphp/src/Value/SassMixin.php create mode 100644 vendor/scssphp/scssphp/src/Value/SassNull.php create mode 100644 vendor/scssphp/scssphp/src/Value/SassNumber.php create mode 100644 vendor/scssphp/scssphp/src/Value/SassString.php create mode 100644 vendor/scssphp/scssphp/src/Value/SingleUnitSassNumber.php create mode 100644 vendor/scssphp/scssphp/src/Value/SpanColorFormat.php create mode 100644 vendor/scssphp/scssphp/src/Value/UnitlessSassNumber.php create mode 100644 vendor/scssphp/scssphp/src/Value/Value.php create mode 100644 vendor/scssphp/scssphp/src/ValueConverter.php create mode 100644 vendor/scssphp/scssphp/src/Version.php create mode 100644 vendor/scssphp/scssphp/src/Visitor/AnySelectorVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Visitor/CssVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Visitor/EveryCssVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Visitor/ExpressionVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Visitor/ModifiableCssVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Visitor/ReplaceExpressionVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Visitor/SelectorSearchVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Visitor/SelectorVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Visitor/StatementSearchVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Visitor/StatementVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Visitor/ValueVisitor.php create mode 100644 vendor/scssphp/scssphp/src/Warn.php create mode 100644 vendor/scssphp/source-span/LICENSE.md create mode 100644 vendor/scssphp/source-span/README.md create mode 100644 vendor/scssphp/source-span/composer.json create mode 100644 vendor/scssphp/source-span/src/ConcreteFileSpan.php create mode 100644 vendor/scssphp/source-span/src/FileLocation.php create mode 100644 vendor/scssphp/source-span/src/FileSpan.php create mode 100644 vendor/scssphp/source-span/src/Highlighter/AsciiGlyph.php create mode 100644 vendor/scssphp/source-span/src/Highlighter/Highlight.php create mode 100644 vendor/scssphp/source-span/src/Highlighter/Highlighter.php create mode 100644 vendor/scssphp/source-span/src/Highlighter/Line.php create mode 100644 vendor/scssphp/source-span/src/SimpleSourceLocation.php create mode 100644 vendor/scssphp/source-span/src/SimpleSourceSpan.php create mode 100644 vendor/scssphp/source-span/src/SimpleSourceSpanWithContext.php create mode 100644 vendor/scssphp/source-span/src/SourceFile.php create mode 100644 vendor/scssphp/source-span/src/SourceLocation.php create mode 100644 vendor/scssphp/source-span/src/SourceLocationMixin.php create mode 100644 vendor/scssphp/source-span/src/SourceSpan.php create mode 100644 vendor/scssphp/source-span/src/SourceSpanMixin.php create mode 100644 vendor/scssphp/source-span/src/SourceSpanWithContext.php create mode 100644 vendor/scssphp/source-span/src/Util.php create mode 100644 vendor/symfony/filesystem/CHANGELOG.md create mode 100644 vendor/symfony/filesystem/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/filesystem/Exception/FileNotFoundException.php create mode 100644 vendor/symfony/filesystem/Exception/IOException.php create mode 100644 vendor/symfony/filesystem/Exception/IOExceptionInterface.php create mode 100644 vendor/symfony/filesystem/Exception/InvalidArgumentException.php create mode 100644 vendor/symfony/filesystem/Exception/RuntimeException.php create mode 100644 vendor/symfony/filesystem/Filesystem.php create mode 100644 vendor/symfony/filesystem/LICENSE create mode 100644 vendor/symfony/filesystem/Path.php create mode 100644 vendor/symfony/filesystem/README.md create mode 100644 vendor/symfony/filesystem/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/bootstrap80.php create mode 100644 vendor/symfony/polyfill-ctype/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/caseFolding.php 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/bootstrap80.php create mode 100644 vendor/symfony/polyfill-mbstring/composer.json create mode 100644 vendor/twig/twig/CHANGELOG create mode 100644 vendor/twig/twig/LICENSE create mode 100644 vendor/twig/twig/README.rst create mode 100644 vendor/twig/twig/composer.json create mode 100644 vendor/twig/twig/src/AbstractTwigCallable.php create mode 100644 vendor/twig/twig/src/Attribute/AsTwigFilter.php create mode 100644 vendor/twig/twig/src/Attribute/AsTwigFunction.php create mode 100644 vendor/twig/twig/src/Attribute/AsTwigTest.php create mode 100644 vendor/twig/twig/src/Attribute/FirstClassTwigCallableReady.php create mode 100644 vendor/twig/twig/src/Attribute/YieldReady.php create mode 100644 vendor/twig/twig/src/Cache/CacheInterface.php create mode 100644 vendor/twig/twig/src/Cache/ChainCache.php create mode 100644 vendor/twig/twig/src/Cache/FilesystemCache.php create mode 100644 vendor/twig/twig/src/Cache/NullCache.php create mode 100644 vendor/twig/twig/src/Cache/ReadOnlyFilesystemCache.php create mode 100644 vendor/twig/twig/src/Cache/RemovableCacheInterface.php create mode 100644 vendor/twig/twig/src/Compiler.php create mode 100644 vendor/twig/twig/src/DeprecatedCallableInfo.php create mode 100644 vendor/twig/twig/src/Environment.php create mode 100644 vendor/twig/twig/src/Error/Error.php create mode 100644 vendor/twig/twig/src/Error/LoaderError.php create mode 100644 vendor/twig/twig/src/Error/RuntimeError.php create mode 100644 vendor/twig/twig/src/Error/SyntaxError.php create mode 100644 vendor/twig/twig/src/ExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/AbstractExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/ExpressionParserDescriptionInterface.php create mode 100644 vendor/twig/twig/src/ExpressionParser/ExpressionParserInterface.php create mode 100644 vendor/twig/twig/src/ExpressionParser/ExpressionParserType.php create mode 100644 vendor/twig/twig/src/ExpressionParser/ExpressionParsers.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Infix/ArgumentsTrait.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Infix/ArrowExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Infix/AssignmentExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Infix/BinaryOperatorExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Infix/ConditionalTernaryExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Infix/DotExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Infix/FilterExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Infix/FunctionExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Infix/IsExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Infix/IsNotExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Infix/SquareBracketExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/InfixAssociativity.php create mode 100644 vendor/twig/twig/src/ExpressionParser/InfixExpressionParserInterface.php create mode 100644 vendor/twig/twig/src/ExpressionParser/PrecedenceChange.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Prefix/GroupingExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Prefix/LiteralExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/Prefix/UnaryOperatorExpressionParser.php create mode 100644 vendor/twig/twig/src/ExpressionParser/PrefixExpressionParserInterface.php create mode 100644 vendor/twig/twig/src/Extension/AbstractExtension.php create mode 100644 vendor/twig/twig/src/Extension/AttributeExtension.php create mode 100644 vendor/twig/twig/src/Extension/CoreExtension.php create mode 100644 vendor/twig/twig/src/Extension/DebugExtension.php create mode 100644 vendor/twig/twig/src/Extension/EscaperExtension.php create mode 100644 vendor/twig/twig/src/Extension/ExtensionInterface.php create mode 100644 vendor/twig/twig/src/Extension/GlobalsInterface.php create mode 100644 vendor/twig/twig/src/Extension/LastModifiedExtensionInterface.php create mode 100644 vendor/twig/twig/src/Extension/OptimizerExtension.php create mode 100644 vendor/twig/twig/src/Extension/ProfilerExtension.php create mode 100644 vendor/twig/twig/src/Extension/RuntimeExtensionInterface.php create mode 100644 vendor/twig/twig/src/Extension/SandboxExtension.php create mode 100644 vendor/twig/twig/src/Extension/StagingExtension.php create mode 100644 vendor/twig/twig/src/Extension/StringLoaderExtension.php create mode 100644 vendor/twig/twig/src/Extension/YieldNotReadyExtension.php create mode 100644 vendor/twig/twig/src/ExtensionSet.php create mode 100644 vendor/twig/twig/src/FileExtensionEscapingStrategy.php create mode 100644 vendor/twig/twig/src/Lexer.php create mode 100644 vendor/twig/twig/src/Loader/ArrayLoader.php create mode 100644 vendor/twig/twig/src/Loader/ChainLoader.php create mode 100644 vendor/twig/twig/src/Loader/FilesystemLoader.php create mode 100644 vendor/twig/twig/src/Loader/LoaderInterface.php create mode 100644 vendor/twig/twig/src/Markup.php create mode 100644 vendor/twig/twig/src/Node/AutoEscapeNode.php create mode 100644 vendor/twig/twig/src/Node/BlockNode.php create mode 100644 vendor/twig/twig/src/Node/BlockReferenceNode.php create mode 100644 vendor/twig/twig/src/Node/BodyNode.php create mode 100644 vendor/twig/twig/src/Node/CaptureNode.php create mode 100644 vendor/twig/twig/src/Node/CheckSecurityCallNode.php create mode 100644 vendor/twig/twig/src/Node/CheckSecurityNode.php create mode 100644 vendor/twig/twig/src/Node/CheckToStringNode.php create mode 100644 vendor/twig/twig/src/Node/CoercesChildrenToStringInterface.php create mode 100644 vendor/twig/twig/src/Node/ConfigNode.php create mode 100644 vendor/twig/twig/src/Node/DeprecatedNode.php create mode 100644 vendor/twig/twig/src/Node/DoNode.php create mode 100644 vendor/twig/twig/src/Node/EmbedNode.php create mode 100644 vendor/twig/twig/src/Node/EmptyNode.php create mode 100644 vendor/twig/twig/src/Node/Expression/AbstractExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/ArrayExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/AssignNameExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/BinaryInterface.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/ElvisBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/HasEveryBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/HasSomeBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/InBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/NotSameAsBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/NullCoalesceBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/ObjectDestructuringSetBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/SameAsBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/SequenceDestructuringSetBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/SetBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Binary/XorBinary.php create mode 100644 vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/CallExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/ConditionalExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/ConstantExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/EmptyExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php create mode 100644 vendor/twig/twig/src/Node/Expression/Filter/RawFilter.php create mode 100644 vendor/twig/twig/src/Node/Expression/FilterExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/FunctionExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/FunctionNode/EnumCasesFunction.php create mode 100644 vendor/twig/twig/src/Node/Expression/FunctionNode/EnumFunction.php create mode 100644 vendor/twig/twig/src/Node/Expression/GetAttrExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/InlinePrint.php create mode 100644 vendor/twig/twig/src/Node/Expression/ListExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/MacroReferenceExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/MethodCallExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/NameExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/OperatorEscapeInterface.php create mode 100644 vendor/twig/twig/src/Node/Expression/ParentExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/ReturnArrayInterface.php create mode 100644 vendor/twig/twig/src/Node/Expression/ReturnBoolInterface.php create mode 100644 vendor/twig/twig/src/Node/Expression/ReturnNumberInterface.php create mode 100644 vendor/twig/twig/src/Node/Expression/ReturnPrimitiveTypeInterface.php create mode 100644 vendor/twig/twig/src/Node/Expression/ReturnStringInterface.php create mode 100644 vendor/twig/twig/src/Node/Expression/SupportDefinedTestDeprecationTrait.php create mode 100644 vendor/twig/twig/src/Node/Expression/SupportDefinedTestInterface.php create mode 100644 vendor/twig/twig/src/Node/Expression/SupportDefinedTestTrait.php create mode 100644 vendor/twig/twig/src/Node/Expression/TempNameExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/Ternary/ConditionalTernary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php create mode 100644 vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php create mode 100644 vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php create mode 100644 vendor/twig/twig/src/Node/Expression/Test/EvenTest.php create mode 100644 vendor/twig/twig/src/Node/Expression/Test/NullTest.php create mode 100644 vendor/twig/twig/src/Node/Expression/Test/OddTest.php create mode 100644 vendor/twig/twig/src/Node/Expression/Test/SameasTest.php create mode 100644 vendor/twig/twig/src/Node/Expression/Test/TrueTest.php create mode 100644 vendor/twig/twig/src/Node/Expression/TestExpression.php create mode 100644 vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Unary/SpreadUnary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Unary/StringCastUnary.php create mode 100644 vendor/twig/twig/src/Node/Expression/Unary/UnaryInterface.php create mode 100644 vendor/twig/twig/src/Node/Expression/Variable/AssignContextVariable.php create mode 100644 vendor/twig/twig/src/Node/Expression/Variable/AssignTemplateVariable.php create mode 100644 vendor/twig/twig/src/Node/Expression/Variable/ContextVariable.php create mode 100644 vendor/twig/twig/src/Node/Expression/Variable/LocalVariable.php create mode 100644 vendor/twig/twig/src/Node/Expression/Variable/TemplateVariable.php create mode 100644 vendor/twig/twig/src/Node/Expression/VariadicExpression.php create mode 100644 vendor/twig/twig/src/Node/FlushNode.php create mode 100644 vendor/twig/twig/src/Node/ForElseNode.php create mode 100644 vendor/twig/twig/src/Node/ForLoopNode.php create mode 100644 vendor/twig/twig/src/Node/ForNode.php create mode 100644 vendor/twig/twig/src/Node/IfNode.php create mode 100644 vendor/twig/twig/src/Node/ImportNode.php create mode 100644 vendor/twig/twig/src/Node/IncludeNode.php create mode 100644 vendor/twig/twig/src/Node/MacroNode.php create mode 100644 vendor/twig/twig/src/Node/ModuleNode.php create mode 100644 vendor/twig/twig/src/Node/NameDeprecation.php create mode 100644 vendor/twig/twig/src/Node/Node.php create mode 100644 vendor/twig/twig/src/Node/NodeCaptureInterface.php create mode 100644 vendor/twig/twig/src/Node/NodeOutputInterface.php create mode 100644 vendor/twig/twig/src/Node/Nodes.php create mode 100644 vendor/twig/twig/src/Node/PrintNode.php create mode 100644 vendor/twig/twig/src/Node/SandboxNode.php create mode 100644 vendor/twig/twig/src/Node/SetNode.php create mode 100644 vendor/twig/twig/src/Node/TextNode.php create mode 100644 vendor/twig/twig/src/Node/TypesNode.php create mode 100644 vendor/twig/twig/src/Node/WithNode.php create mode 100644 vendor/twig/twig/src/NodeTraverser.php create mode 100644 vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php create mode 100644 vendor/twig/twig/src/NodeVisitor/CorrectnessNodeVisitor.php create mode 100644 vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php create mode 100644 vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php create mode 100644 vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php create mode 100644 vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php create mode 100644 vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php create mode 100644 vendor/twig/twig/src/NodeVisitor/YieldNotReadyNodeVisitor.php create mode 100644 vendor/twig/twig/src/OperatorPrecedenceChange.php create mode 100644 vendor/twig/twig/src/Parser.php create mode 100644 vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php create mode 100644 vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php create mode 100644 vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php create mode 100644 vendor/twig/twig/src/Profiler/Dumper/TextDumper.php create mode 100644 vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php create mode 100644 vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php create mode 100644 vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php create mode 100644 vendor/twig/twig/src/Profiler/Profile.php create mode 100644 vendor/twig/twig/src/Resources/core.php create mode 100644 vendor/twig/twig/src/Resources/debug.php create mode 100644 vendor/twig/twig/src/Resources/escaper.php create mode 100644 vendor/twig/twig/src/Resources/string_loader.php create mode 100644 vendor/twig/twig/src/Runtime/EscaperRuntime.php create mode 100644 vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php create mode 100644 vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php create mode 100644 vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php create mode 100644 vendor/twig/twig/src/Sandbox/SecurityError.php create mode 100644 vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php create mode 100644 vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php create mode 100644 vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php create mode 100644 vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php create mode 100644 vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php create mode 100644 vendor/twig/twig/src/Sandbox/SecurityNotAllowedTestError.php create mode 100644 vendor/twig/twig/src/Sandbox/SecurityPolicy.php create mode 100644 vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php create mode 100644 vendor/twig/twig/src/Sandbox/SourcePolicyInterface.php create mode 100644 vendor/twig/twig/src/Source.php create mode 100644 vendor/twig/twig/src/Template.php create mode 100644 vendor/twig/twig/src/TemplateWrapper.php create mode 100644 vendor/twig/twig/src/Test/IntegrationTestCase.php create mode 100644 vendor/twig/twig/src/Test/NodeTestCase.php create mode 100644 vendor/twig/twig/src/Token.php create mode 100644 vendor/twig/twig/src/TokenParser/AbstractTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/ApplyTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/BlockTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/DoTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/EmbedTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/FlushTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/ForTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/FromTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/GuardTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/IfTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/ImportTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/IncludeTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/MacroTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/SandboxTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/SetTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/TokenParserInterface.php create mode 100644 vendor/twig/twig/src/TokenParser/TypesTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/UseTokenParser.php create mode 100644 vendor/twig/twig/src/TokenParser/WithTokenParser.php create mode 100644 vendor/twig/twig/src/TokenStream.php create mode 100644 vendor/twig/twig/src/TwigCallableInterface.php create mode 100644 vendor/twig/twig/src/TwigFilter.php create mode 100644 vendor/twig/twig/src/TwigFunction.php create mode 100644 vendor/twig/twig/src/TwigTest.php create mode 100644 vendor/twig/twig/src/Util/CallableArgumentsExtractor.php create mode 100644 vendor/twig/twig/src/Util/CallableParameters.php create mode 100644 vendor/twig/twig/src/Util/DeprecationCollector.php create mode 100644 vendor/twig/twig/src/Util/ReflectionCallable.php create mode 100644 vendor/twig/twig/src/Util/TemplateDirIterator.php diff --git a/.gitignore b/.gitignore index 0fca4d1..449347d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,9 @@ admin/storage/cache/ admin/storage/geoip/ admin/storage/stats.json +# Runtime-compiled theme assets +public/themes/ + # Temporary files *.tmp *.temp diff --git a/AGENTS.md b/AGENTS.md index 1e1ed16..8a1ed74 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,7 +7,7 @@ ## Build & Run - **Run Server**: `php -S localhost:8080 cms/router.php` (router nodig voor clean URLs) - **Lint PHP**: `find . -name "*.php" -not -path "./vendor/*" -exec php -l {} \;` -- **Dependencies**: Composer vereist voor CommonMark. Geen NPM. +- **Dependencies**: Composer vereist voor CommonMark, Twig en scssphp. Geen NPM. - **Admin Console**: Toegankelijk op `/admin.php` (standaard login: `admin` / `admin`) ## Project Structuur @@ -17,24 +17,29 @@ codepress/ │ ├── core/ │ │ ├── class/ │ │ │ ├── CodePressCMS.php # Hoofd CMS class +│ │ │ ├── ThemeManager.php # Thema-resolver + Twig render + SCSS compile │ │ │ ├── Logger.php # Logging systeem -│ │ │ └── SimpleTemplate.php # Mustache-style template engine +│ │ │ └── SimpleTemplate.php # Legacy Mustache-style engine (niet meer gebruikt) │ │ ├── plugin/ │ │ │ ├── PluginManager.php # Plugin loader │ │ │ └── CMSAPI.php # API voor plugins │ │ ├── config.php # Config loader (leest config.json) │ │ └── index.php # Bootstrap (autoloader, requires) │ ├── lang/ # Taalbestanden (nl.php, en.php) -│ ├── templates/ # Mustache templates -│ │ ├── layout.mustache # Hoofd layout (bevat inline CSS) -│ │ ├── assets/ -│ │ │ ├── header.mustache -│ │ │ ├── navigation.mustache -│ │ │ └── footer.mustache -│ │ ├── markdown_content.mustache -│ │ ├── php_content.mustache -│ │ └── html_content.mustache -│ └── router.php # PHP dev server router +│ └── router.php # PHP dev server router (serveert ook /themes/) +├── themes/ # Dynamische thema's (volledig zelfstandig) +│ ├── default/ # Standaard thema +│ │ ├── theme.json # { title, default_layout, layout→.twig mapping, kleuren } +│ │ ├── base.twig # Hoofd layout (head, header, nav, footer) +│ │ ├── full_content.twig # Layout: volledige breedte +│ │ ├── left_sidebar.twig # Layout: sidebar links +│ │ ├── right_sidebar.twig # Layout: sidebar rechts +│ │ ├── custom1.twig # Layout: custom +│ │ ├── partials/ # header.twig, navigation.twig, footer.twig +│ │ ├── css/theme.scss # SCSS bron (runtime gecompileerd) +│ │ └── js/theme.js # Thema JavaScript +│ ├── demo/ # Demo thema (zelfde structuur, andere look) +│ └── test/ # Test thema ├── admin/ # Admin paneel │ ├── config/ │ │ ├── app.php # Admin app configuratie @@ -53,6 +58,7 @@ codepress/ │ │ ├── config.php │ │ ├── plugins.php │ │ ├── plugin-config.php +│ │ ├── theme.php │ │ └── users.php │ └── storage/logs/ # Admin logs ├── cli/ # CLI scripts & tests @@ -86,7 +92,7 @@ codepress/ - Admin entry point + routing: `public/admin.php` - Admin authenticatie: `admin/src/AdminAuth.php` - **Content**: Stored in `content/`. Supports `.md` (Markdown), `.php` (Dynamic), `.html` (Static). -- **Templating**: Mustache-style `{{placeholder}}` in `templates/layout.mustache` via `SimpleTemplate.php`. +- **Templating**: Twig templates in `themes//`. `ThemeManager` rendert via Twig en compileert `css/theme.scss` runtime naar `public/themes//theme.css`. Layout gekozen via frontmatter `layout:` key; onbekende layouts vallen terug op `default_layout` in `theme.json`. - **Navigation**: Auto-generated from directory structure. Folders require an index file to be clickable in breadcrumbs. - **Security**: - Always use `htmlspecialchars()` for outputting user/content data @@ -115,5 +121,5 @@ codepress/ ## Bekende aandachtspunten - LSP errors over "Undefined function" in PHP files zijn vals-positief (standaard PHP functies worden niet herkend door de LSP). Negeer deze. - Zie `TODO.md` voor alle openstaande verbeteringen en nieuwe features. -- `vendor/` map bevat Composer dependencies (CommonMark, Mustache). Niet handmatig wijzigen. +- `vendor/` map bevat Composer dependencies (CommonMark, Twig, scssphp, Mustache). Niet handmatig wijzigen. - `admin/config/admin.json` bevat wachtwoord-hashes. Niet committen met echte productie-wachtwoorden. diff --git a/README.en.md b/README.en.md index 5bdd13f..40cecca 100644 --- a/README.en.md +++ b/README.en.md @@ -49,13 +49,20 @@ codepress/ │ │ ├── config.php # Configuration loader │ │ └── index.php # Bootstrap (autoloader) │ ├── lang/ # Language files (nl.php, en.php) -│ ├── templates/ # Mustache templates -│ │ ├── layout.mustache -│ │ ├── assets/ (header, navigation, footer) -│ │ ├── markdown_content.mustache -│ │ ├── php_content.mustache -│ │ └── html_content.mustache -│ └── router.php # PHP dev server router +│ └── router.php # PHP dev server router (also serves /themes/) +├── themes/ # Dynamic themes (fully self-contained) +│ ├── default/ # Default theme +│ │ ├── theme.json # { title, default_layout, layout→.twig mapping, colors } +│ │ ├── base.twig # Main layout +│ │ ├── full_content.twig # Layout: full width +│ │ ├── left_sidebar.twig # Layout: sidebar left +│ │ ├── right_sidebar.twig # Layout: sidebar right +│ │ ├── custom1.twig # Layout: custom +│ │ ├── partials/ # header, navigation, footer +│ │ ├── css/theme.scss # SCSS source (compiled at runtime) +│ │ └── js/theme.js # Theme JavaScript +│ ├── demo/ # Demo theme +│ └── test/ # Test theme ├── admin/ # Admin panel │ ├── config/ │ │ ├── app.php # Admin configuration @@ -96,7 +103,6 @@ codepress/ { "site_title": "CodePress", "content_dir": "content", - "templates_dir": "cms/templates", "default_page": "index", "active_theme": "default", "language": { diff --git a/README.md b/README.md index d8ce397..c2451ab 100644 --- a/README.md +++ b/README.md @@ -49,13 +49,20 @@ codepress/ │ │ ├── config.php # Config loader │ │ └── index.php # Bootstrap (autoloader) │ ├── lang/ # Taalbestanden (nl.php, en.php) -│ ├── templates/ # Mustache templates -│ │ ├── layout.mustache -│ │ ├── assets/ (header, navigation, footer) -│ │ ├── markdown_content.mustache -│ │ ├── php_content.mustache -│ │ └── html_content.mustache -│ └── router.php # PHP dev server router +│ └── router.php # PHP dev server router (serveert ook /themes/) +├── themes/ # Dynamische thema's (volledig zelfstandig) +│ ├── default/ # Standaard thema +│ │ ├── theme.json # { title, default_layout, layout→.twig mapping, kleuren } +│ │ ├── base.twig # Hoofd layout +│ │ ├── full_content.twig # Layout: volledige breedte +│ │ ├── left_sidebar.twig # Layout: sidebar links +│ │ ├── right_sidebar.twig # Layout: sidebar rechts +│ │ ├── custom1.twig # Layout: custom +│ │ ├── partials/ # header, navigation, footer +│ │ ├── css/theme.scss # SCSS bron (runtime gecompileerd) +│ │ └── js/theme.js # Thema JavaScript +│ ├── demo/ # Demo thema +│ └── test/ # Test thema ├── admin/ # Admin paneel │ ├── config/ │ │ ├── app.php # Admin configuratie @@ -96,7 +103,6 @@ codepress/ { "site_title": "CodePress", "content_dir": "content", - "templates_dir": "cms/templates", "default_page": "index", "active_theme": "default", "language": { diff --git a/admin/templates/layout.php b/admin/templates/layout.php index ce787fb..e4f112d 100644 --- a/admin/templates/layout.php +++ b/admin/templates/layout.php @@ -171,6 +171,11 @@ $layoutSidebarColor = $layoutThemeConfig['header_color'] ?? '#0a369d'; case 'theme': require __DIR__ . '/pages/theme.php'; break; + + case 'theme-new': + require __DIR__ . '/pages/theme-new.php'; + break; + case 'plugins': require __DIR__ . '/pages/plugins.php'; break; diff --git a/admin/templates/pages/config.php b/admin/templates/pages/config.php index 9ffa94d..68060e7 100644 --- a/admin/templates/pages/config.php +++ b/admin/templates/pages/config.php @@ -95,9 +95,9 @@ value="">
- - + +
@@ -140,6 +140,84 @@ +
+
+ Logging +
+
+ +
+ > + +
+ +
+
+ + +
Kies Syslog om logregels naar een externe syslog-server te sturen. Logregels worden altijd ook lokaal opgeslagen.
+
+
+ +
+
+ + +
Vul de host van de syslog-server in (bijv. 192.168.1.10 of logs.example.com).
+
+
+ + +
+
+ + +
Categorie van de logbron (bijv. local0local7 voor eigen applicaties).
+
+
+ +
+ + +
+ +
+ + +
+ 'Admin activiteiten', + 'requests' => 'Requests (pagina bezoeken)', + 'errors' => 'Fouten & waarschuwingen', + 'security' => 'Beveiliging', + 'content' => 'Content wijzigingen', + 'system' => 'Systeem', + ]; + foreach ($eventLabels as $key => $label): + ?> +
+
+ > + +
+
+ +
+
+
+
+ diff --git a/admin/templates/pages/content-edit.php b/admin/templates/pages/content-edit.php index c87540f..4c7542f 100644 --- a/admin/templates/pages/content-edit.php +++ b/admin/templates/pages/content-edit.php @@ -18,11 +18,17 @@
diff --git a/admin/templates/pages/content-new.php b/admin/templates/pages/content-new.php index ed20c6c..b93dfe7 100644 --- a/admin/templates/pages/content-new.php +++ b/admin/templates/pages/content-new.php @@ -28,11 +28,17 @@
diff --git a/admin/templates/pages/logs.php b/admin/templates/pages/logs.php index bac2c78..50c38ce 100644 --- a/admin/templates/pages/logs.php +++ b/admin/templates/pages/logs.php @@ -1,117 +1,79 @@

Logs

- - -
- -
-
- regels -
- Download - Wissen +
+
+
+
+ +
-
-
-
- -

Geen activiteiten geregistreerd.

- - - - - - - - - - - - - - - - - - - - -
TijdNiveauIPBericht
- +
+ +
-
+
+ + +
+
+ + +
+
+ + +
+
+
- -
-
- regels - -
-
-
- -

Geen requests geregistreerd.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TijdIPLandPaginaType / GebruikerStatusTaalUser agentReferrer
- - - - - - - - - - Geblokkeerd - - - - OK - - - 50 ? '…' : '' ?> 30 ? '…' : '' ?>
- -
-
+
+ regels +
+
+
+ +

Geen logregels gevonden.

+ + + + + + + + + + + + + + + + + + + + + + +
TijdGebeurtenisNiveauIPBericht
+
-
\ No newline at end of file +
diff --git a/admin/templates/pages/theme-new.php b/admin/templates/pages/theme-new.php new file mode 100644 index 0000000..3359b72 --- /dev/null +++ b/admin/templates/pages/theme-new.php @@ -0,0 +1,38 @@ +

Nieuw thema aanmaken

+ +
+ + +
+ +
+ + +
+ + +
Alleen letters, cijfers, streepjes en underscores. Begin met een letter. Wordt gebruikt als mapnaam.
+
+ +
+ Wat wordt er aangemaakt? +
    +
  • themes/ThemaNaam/theme.json — Configuratie (default template + template mapping)
  • +
  • themes/ThemaNaam/base.twig — Hoofd layout
  • +
  • themes/ThemaNaam/*.twig — Layout-sjablonen
  • +
  • themes/ThemaNaam/partials/ — header, navigation, footer
  • +
  • themes/ThemaNaam/css/theme.scss — Styling (kleuren, hoogtes, achtergrond)
  • +
  • themes/ThemaNaam/js/theme.js — Thema JavaScript
  • +
  • themes/ThemaNaam/theme.png — Voorbeeldafbeelding
  • +
+

Het nieuwe thema wordt gekopieerd van het standaard thema. Pas daarna de SCSS-kleuren en sjablonen aan naar wens.

+
+
+ + +
diff --git a/admin/templates/pages/theme.php b/admin/templates/pages/theme.php index dd434fc..710f3c3 100644 --- a/admin/templates/pages/theme.php +++ b/admin/templates/pages/theme.php @@ -1,283 +1,104 @@ - +
+

Thema's

+ + Nieuwe thema + +
- -
-

Bewerk thema:

- - Terug - -
- -
-
-
- - - - -
-
- - +
+
+
Thema-ontwikkelaarshandleiding
+

Een thema is een volledig zelfstandige map en moet aan de volgende eisen voldoen:

+
+
+
+ +
+ Mapstructuur
+ themes/Naam/theme.json + Elke thema-map moet een theme.json bevatten.
- -
-
-
-
Header
-
-
- -
- - -
-
-
- -
- - -
-
-
-
-
-
-
-
Navigatie
-
-
- -
- - -
-
-
- -
- - -
-
-
-
-
-
-
-
Sidebar
-
-
- -
- - -
-
-
- -
- - -
-
-
-
+
+
+
+ +
+ Sjablonen (Twig)
+ base.twig + *.twig + Layout-sjablonen die via config.default_template en template worden gekozen.
- -
-
-
-
Hoogte balken
-
-
- - -
-
- - -
-
-
-
-
-
-
Header achtergrond afbeelding
-
-
- - - Toegestaan: JPG, PNG, GIF, WebP, SVG -
-
- -
- -
- -
-
- Huidig: - -
-
- - -
-
- -
-
- -
- - % -
- 100% = volledig zichtbaar, 50% = half doorzichtig, 0% = onzichtbaar -
-
-
+
+
+
+ +
+ Styling & voorbeeld
+ css/theme.scss + theme.png + Kleuren/hoogtes in SCSS, een theme.png voorbeeld voor de selectie.
- -
- - Annuleren -
- -
-
- - - - -
-

Thema's

- -
- -
-
-
-
- - -
- - -
-
- -
-
+
$themeData): ?> +
-
-
-
-
- - Actief - +
+
+
+ + Voorbeeld thema <?= htmlspecialchars($themeData['title'] ?? $themeData['name'] ?? $themeName) ?>
- - -
-
- Header: - - -
-
- Navigatie: - - -
-
- Sidebar: - - -
-
- - -
-
- Header: px · Navigatie: px -
- -
- Achtergrond: % zichtbaar - - - -
- -
- -
- - Bewerken - - -
- - - - -
- +
+ +
+ + Actief + +
+ +
- - - + diff --git a/cms/core/class/CodePressCMS.php b/cms/core/class/CodePressCMS.php index 390656c..25b3a46 100644 --- a/cms/core/class/CodePressCMS.php +++ b/cms/core/class/CodePressCMS.php @@ -591,7 +591,7 @@ class CodePressCMS { } } - $authorWebsite = $this->config['author']['website'] ?? ''; + $authorWebsite = $this->normalizeUrl($this->config['author']['website'] ?? ''); if ($authorWebsite !== '') { $authorHost = parse_url($authorWebsite, PHP_URL_HOST); if ($authorHost) { @@ -602,6 +602,25 @@ class CodePressCMS { return array_values(array_unique(array_filter($hosts))); } + /** + * Normalize a URL: if no scheme is present, prepend https://. + * Handles hostnames stored without protocol (e.g. "noorlander.info"). + * + * @param string $url Raw URL or hostname + * @return string Normalized absolute URL, or '' if empty + */ + private function normalizeUrl(string $url): string + { + $url = trim($url); + if ($url === '') { + return ''; + } + if (!preg_match('#^[a-zA-Z][a-zA-Z0-9+.\-]*://#', $url)) { + return 'https://' . $url; + } + return $url; + } + /** * Parse Markdown content to HTML using League CommonMark * @@ -1140,7 +1159,7 @@ class CodePressCMS { 'is_guide_page' => isset($_GET['guide']), 'lang_switch_url' => '', 'author_name' => $this->config['author']['name'] ?? 'CodePress Developer', - 'author_website' => $this->config['author']['website'] ?? '#', + 'author_website' => $this->normalizeUrl($this->config['author']['website'] ?? '') ?: '#', 'author_git' => 'https://git.noorlander.info/E.Noorlander', 'seo_description' => $this->config['seo']['description'] ?? 'CodePress CMS - Lightweight file-based content management system', 'seo_keywords' => $this->config['seo']['keywords'] ?? 'cms, php, content management, file-based', @@ -1156,8 +1175,6 @@ class CodePressCMS { 'nav_height' => $this->config['theme']['nav_height'] ?? '42', 'sidebar_background' => $this->config['theme']['sidebar_background'] ?? '#f8f9fa', 'sidebar_border' => $this->config['theme']['sidebar_border'] ?? '#dee2e6', - 'background_image_css' => $this->getBackgroundImageCss(), - 'background_image_opacity' => $this->getBackgroundImageOpacity(), // Language 'current_lang' => $this->currentLanguage, 'current_lang_upper' => strtoupper($this->currentLanguage), @@ -1216,36 +1233,21 @@ class CodePressCMS { // Don't show site title link on guide page $templateData['show_site_link'] = !$this->isContentDirEmpty() && !isset($_GET['guide']); - // Load and render all templates with data - $layoutTemplate = file_get_contents($this->config['templates_dir'] . '/layout.mustache'); - $headerTemplate = file_get_contents($this->config['templates_dir'] . '/assets/header.mustache'); - $navigationTemplate = file_get_contents($this->config['templates_dir'] . '/assets/navigation.mustache'); - $footerTemplate = file_get_contents($this->config['templates_dir'] . '/assets/footer.mustache'); - - // Determine content type and load appropriate template - $contentType = $this->getContentType($page); - $contentTemplateFile = $this->config['templates_dir'] . '/' . $contentType . '_content.mustache'; - $contentTemplate = file_exists($contentTemplateFile) ? file_get_contents($contentTemplateFile) : '
{{{content}}}
'; - + // Map legacy frontmatter layout values to theme template keys + $layoutKey = $this->mapLayoutToThemeKey($layout); + + // Add theme asset URLs to template data + $themeManager = new ThemeManager($this->config); + $templateData['theme_title'] = $themeManager->getTitle(); + $templateData['theme_css_url'] = $themeManager->getCssUrl(); + $templateData['theme_js_url'] = $themeManager->getJsUrl(); + $templateData['theme_config'] = $themeManager->getConfig(); + + // Render the page through the active theme + $renderedLayout = $themeManager->render($layoutKey, $templateData); - - // Render all templates with data - $renderedHeader = SimpleTemplate::render($headerTemplate, $templateData); - $renderedNavigation = SimpleTemplate::render($navigationTemplate, $templateData); - $renderedFooter = SimpleTemplate::render($footerTemplate, $templateData); - $renderedContent = SimpleTemplate::render($contentTemplate, $templateData); - - // Replace partials in layout - $finalTemplate = str_replace('{{>header}}', $renderedHeader, $layoutTemplate); - $finalTemplate = str_replace('{{>navigation}}', $renderedNavigation, $finalTemplate); - $finalTemplate = str_replace('{{>footer}}', $renderedFooter, $finalTemplate); - $finalTemplate = str_replace('{{>content_template}}', $renderedContent, $finalTemplate); - - // Render the final layout with all template data - $renderedLayout = SimpleTemplate::render($finalTemplate, $templateData); - echo $renderedLayout; - + $this->pluginManager->doAction('onAfterRender', $renderedLayout); } @@ -1371,6 +1373,25 @@ class CodePressCMS { return $html; } + /** + * Map a frontmatter layout value to a theme template key. + * + * Legacy values are translated to the new theme keys. Unknown values + * are passed through so ThemeManager can fall back to default_layout. + * + * @param string $layout Layout value from page metadata + * @return string Theme template key + */ + private function mapLayoutToThemeKey(string $layout): string { + return match ($layout) { + 'content' => 'full_content', + 'sidebar-content', 'content-sidebar' => 'left_sidebar', + 'content-sidebar-reverse' => 'right_sidebar', + 'sidebar' => 'custom1', + default => $layout, + }; + } + /** * Determine content type for current page * @@ -1540,24 +1561,6 @@ class CodePressCMS { return false; } - private function getBackgroundImageCss(): string - { - $bg = $this->config['theme']['background_image'] ?? ''; - if (empty($bg)) { - return 'none'; - } - if (str_starts_with($bg, 'http')) { - return 'url(' . $bg . ')'; - } - return 'url(/themes/' . $bg . ')'; - } - - private function getBackgroundImageOpacity(): int - { - $opacity = intval($this->config['theme']['background_image_opacity'] ?? 100); - return max(0, min(100, $opacity)); - } - private function processContent(string $content): string { return str_replace('-/assets/', '/-assets/', $content); diff --git a/cms/core/class/LogManager.php b/cms/core/class/LogManager.php new file mode 100644 index 0000000..5009e71 --- /dev/null +++ b/cms/core/class/LogManager.php @@ -0,0 +1,365 @@ + date('Y-m-d H:i:s'), + 'event' => $event, + 'level' => $level, + 'message' => $message, + 'ip' => $context['ip'] ?? (class_exists('RequestLogger') ? RequestLogger::getClientIp() : ''), + 'context' => $context, + ]; + + $driver = self::getDriver(); + + // Always store locally (sqlite or file fallback) so the dynamic log + // in the admin always has entries. + if ($driver === 'sqlite') { + self::writeSqlite($entry); + } else { + self::writeFile($entry); + } + + // Additionally forward to a remote syslog server if one is configured. + $syslogHost = trim(self::$config['syslog_host'] ?? ''); + if ($syslogHost !== '') { + self::writeSyslog($entry); + } + } + + /** + * Send a log entry to a remote syslog server over UDP. + */ + private static function writeSyslog(array $entry): void + { + $host = trim(self::$config['syslog_host'] ?? ''); + $port = (int)(self::$config['syslog_port'] ?? 514); + $facility = self::syslogFacility(self::$config['syslog_facility'] ?? 'local0'); + $ident = self::$config['syslog_ident'] ?? 'codepress'; + + $severity = self::syslogSeverity($entry['level']); + $pri = ($facility * 8) + $severity; + + $msg = '<' . $pri . '>' . date('M d H:i:s') . ' ' . $ident . '[' . getmypid() . ']: ' + . '[' . $entry['event'] . '] [' . $entry['level'] . '] ' . $entry['message']; + + $sock = @fsockopen('udp://' . $host, $port, $errno, $errstr, 2); + if ($sock) { + @fwrite($sock, $msg . "\n"); + @fclose($sock); + } + } + + /** + * Store a log entry in the SQLite database. + */ + private static function writeSqlite(array $entry): void + { + $pdo = self::getPdo(); + if ($pdo === null) { + // SQLite failed -> fall back to file + self::writeFile($entry); + return; + } + + try { + $stmt = $pdo->prepare( + 'INSERT INTO logs (time, event, level, message, ip, context) VALUES (:time, :event, :level, :message, :ip, :context)' + ); + $stmt->execute([ + ':time' => $entry['time'], + ':event' => $entry['event'], + ':level' => $entry['level'], + ':message' => $entry['message'], + ':ip' => $entry['ip'], + ':context' => json_encode($entry['context']), + ]); + } catch (\Throwable $e) { + self::writeFile($entry); + } + } + + /** + * Append a log entry to a plain text file (fallback driver). + */ + private static function writeFile(array $entry): void + { + $dir = dirname(self::$dbPath); + if (!is_dir($dir)) { + @mkdir($dir, 0755, true); + } + $file = $dir . '/codepress.log'; + $line = '[' . $entry['time'] . '] [' . $entry['event'] . '] [' . $entry['level'] . '] [' + . $entry['ip'] . '] ' . $entry['message'] . "\n"; + @file_put_contents($file, $line, FILE_APPEND | LOCK_EX); + } + + /** + * Get (and lazily create) the PDO connection to the SQLite database. + */ + private static function getPdo(): ?\PDO + { + if (self::$pdo !== null) { + return self::$pdo; + } + if (!self::sqliteAvailable()) { + return null; + } + + $dir = dirname(self::$dbPath); + if (!is_dir($dir)) { + @mkdir($dir, 0755, true); + } + + try { + self::$pdo = new \PDO('sqlite:' . self::$dbPath); + self::$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + self::$pdo->exec( + 'CREATE TABLE IF NOT EXISTS logs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + time TEXT NOT NULL, + event TEXT NOT NULL, + level TEXT NOT NULL, + message TEXT NOT NULL, + ip TEXT, + context TEXT + )' + ); + self::$pdo->exec('CREATE INDEX IF NOT EXISTS idx_logs_event ON logs (event)'); + self::$pdo->exec('CREATE INDEX IF NOT EXISTS idx_logs_time ON logs (time)'); + return self::$pdo; + } catch (\Throwable $e) { + self::$pdo = null; + return null; + } + } + + /** + * Whether the SQLite PDO driver is available. + */ + private static function sqliteAvailable(): bool + { + return class_exists('PDO') && in_array('sqlite', \PDO::getAvailableDrivers(), true); + } + + /** + * Map a facility name to its syslog numeric value. + */ + private static function syslogFacility(string $facility): int + { + $map = [ + 'kern' => 0, 'user' => 1, 'mail' => 2, 'daemon' => 3, + 'auth' => 4, 'syslog' => 5, 'lpr' => 6, 'news' => 7, + 'uucp' => 8, 'cron' => 9, 'authpriv' => 10, 'ftp' => 11, + 'local0' => 16, 'local1' => 17, 'local2' => 18, 'local3' => 19, + 'local4' => 20, 'local5' => 21, 'local6' => 22, 'local7' => 23, + ]; + return $map[$facility] ?? 16; + } + + /** + * Map a log level to its syslog severity value. + */ + private static function syslogSeverity(string $level): int + { + $map = [ + 'debug' => 7, + 'info' => 6, + 'notice' => 5, + 'warning' => 4, + 'error' => 3, + 'critical' => 2, + 'alert' => 1, + 'emergency' => 0, + ]; + return $map[strtolower($level)] ?? 6; + } + + /** + * Query recent log entries from the active store. + * + * @param int $limit Number of entries to return + * @param string|null $event Optional event filter + * @param string|null $level Optional level filter (info, warning, error, ...) + * @param string|null $search Optional text search on the message + * @return array List of log entries (newest first) + */ + public static function getLogs(int $limit = 200, ?string $event = null, ?string $level = null, ?string $search = null): array + { + $driver = self::getDriver(); + + if ($driver === 'sqlite') { + $pdo = self::getPdo(); + if ($pdo !== null) { + try { + $sql = 'SELECT time, event, level, message, ip FROM logs'; + $conds = []; + $params = []; + if ($event !== null && $event !== '') { + $conds[] = 'event = :event'; + $params[':event'] = $event; + } + if ($level !== null && $level !== '') { + $conds[] = 'level = :level'; + $params[':level'] = $level; + } + if ($search !== null && $search !== '') { + $conds[] = 'message LIKE :search'; + $params[':search'] = '%' . $search . '%'; + } + if (!empty($conds)) { + $sql .= ' WHERE ' . implode(' AND ', $conds); + } + $sql .= ' ORDER BY id DESC LIMIT ' . (int)$limit; + $stmt = $pdo->prepare($sql); + $stmt->execute($params); + return $stmt->fetchAll(\PDO::FETCH_ASSOC); + } catch (\Throwable $e) { + return []; + } + } + } + + // File fallback + $dir = dirname(self::$dbPath); + $file = $dir . '/codepress.log'; + if (!file_exists($file)) { + return []; + } + $lines = file($file); + $lines = array_slice($lines, -$limit); + $logs = []; + foreach ($lines as $line) { + if (preg_match('/^\[([^\]]+)\] \[([^\]]+)\] \[([^\]]+)\] \[([^\]]+)\] (.+)$/', trim($line), $m)) { + if ($event !== null && $event !== '' && $m[2] !== $event) { + continue; + } + if ($level !== null && $level !== '' && $m[3] !== $level) { + continue; + } + if ($search !== null && $search !== '' && stripos($m[5], $search) === false) { + continue; + } + $logs[] = [ + 'time' => $m[1], + 'event' => $m[2], + 'level' => $m[3], + 'ip' => $m[4], + 'message' => $m[5], + ]; + } + } + return array_reverse($logs); + } + + /** + * Clear all stored log entries. + */ + public static function clear(): void + { + $driver = self::getDriver(); + if ($driver === 'sqlite') { + $pdo = self::getPdo(); + if ($pdo !== null) { + try { + $pdo->exec('DELETE FROM logs'); + return; + } catch (\Throwable $e) { + // fall through to file + } + } + } + $dir = dirname(self::$dbPath); + $file = $dir . '/codepress.log'; + if (file_exists($file)) { + @file_put_contents($file, ''); + } + } +} diff --git a/cms/core/class/Logger.php b/cms/core/class/Logger.php index d4592e3..69ddf7a 100644 --- a/cms/core/class/Logger.php +++ b/cms/core/class/Logger.php @@ -98,6 +98,14 @@ class Logger { // Write to file with error suppression (graceful degradation) @file_put_contents(self::$logFile, $line, FILE_APPEND | LOCK_EX); + + // Route through the dynamic log manager (errors/system events) + if (class_exists('LogManager')) { + $event = ($level === self::ERROR || $level === self::WARNING) + ? LogManager::EVENT_ERRORS + : LogManager::EVENT_SYSTEM; + LogManager::log($event, strtolower($level), $message, $context); + } } /** diff --git a/cms/core/class/RequestLogger.php b/cms/core/class/RequestLogger.php index 3c8b635..edb0f80 100644 --- a/cms/core/class/RequestLogger.php +++ b/cms/core/class/RequestLogger.php @@ -44,6 +44,79 @@ class RequestLogger return $ip; } + /** + * Check whether an IP matches any entry in a list of IPs/CIDR ranges. + * + * Supports exact IPv4/IPv6 addresses and CIDR notation (e.g. 192.168.0.0/16). + * + * @param string $ip The client IP to test + * @param array $list List of IPs and/or CIDR ranges + * @return bool True if the IP matches any entry + */ + public static function ipMatchesList(string $ip, array $list): bool + { + $ip = trim($ip); + if ($ip === '') { + return false; + } + $isV6 = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false; + $packed = $isV6 ? inet_pton($ip) : inet_pton($ip); + + foreach ($list as $entry) { + $entry = trim((string)$entry); + if ($entry === '') { + continue; + } + + // Exact match + if ($entry === $ip) { + return true; + } + + // CIDR notation + if (strpos($entry, '/') !== false) { + [$subnet, $bits] = array_pad(explode('/', $entry, 2), 2, null); + $subnet = trim($subnet); + $subnetPacked = inet_pton($subnet); + if ($subnetPacked === false || $packed === false) { + continue; + } + // Ensure both are the same address family + if (strlen($subnetPacked) !== strlen($packed)) { + continue; + } + $maxBits = strlen($packed) * 8; + $bits = (int)$bits; + if ($bits < 0 || $bits > $maxBits) { + continue; + } + if ($bits === 0) { + return true; + } + $fullBytes = intdiv($bits, 8); + $remainingBits = $bits % 8; + $match = true; + for ($i = 0; $i < $fullBytes; $i++) { + if ($subnetPacked[$i] !== $packed[$i]) { + $match = false; + break; + } + } + if ($match && $remainingBits > 0) { + $mask = 0xFF << (8 - $remainingBits); + if ((ord($subnetPacked[$fullBytes]) & $mask) !== (ord($packed[$fullBytes]) & $mask)) { + $match = false; + } + } + if ($match) { + return true; + } + } + } + + return false; + } + public static function getClientIp(): string { $headerKeys = [ diff --git a/cms/core/class/ThemeManager.php b/cms/core/class/ThemeManager.php new file mode 100644 index 0000000..6d0c852 --- /dev/null +++ b/cms/core/class/ThemeManager.php @@ -0,0 +1,203 @@ +config = $config; + $this->themeDir = $config['theme_dir'] ?? (__DIR__ . '/../../../themes/' . ($config['active_theme'] ?? 'default')); + $this->themeConfig = $config['theme'] ?? []; + $this->compiledCssDir = __DIR__ . '/../../../public/themes'; + + $loader = new FilesystemLoader($this->themeDir); + $this->twig = new Environment($loader, [ + 'cache' => false, + 'autoescape' => false, + ]); + } + + /** + * Get the absolute path of the active theme directory + */ + public function getThemeDir(): string { + return $this->themeDir; + } + + /** + * Get the raw theme.json config array + */ + public function getThemeConfig(): array { + return $this->themeConfig; + } + + /** + * Get the theme title (from theme.json 'title' or 'name') + */ + public function getTitle(): string { + return $this->themeConfig['title'] ?? $this->themeConfig['name'] ?? basename($this->themeDir); + } + + /** + * Get the theme config section (default_template, background settings, etc.) + */ + public function getConfig(): array { + return $this->themeConfig['config'] ?? []; + } + + /** + * Get the theme template section (layout key => .twig file mapping) + */ + public function getTemplates(): array { + return $this->themeConfig['template'] ?? []; + } + + /** + * Resolve the .twig template file for a requested layout. + * + * Templates are defined in theme.json under the "template" section: + * { "template": { "full_content": "full_content.twig", ... } } + * The default template is defined in the "config" section: + * { "config": { "default_template": "full_content", ... } } + * + * Priority: + * 1. If the layout is a known key in the "template" section, use its mapped file. + * 2. Otherwise fall back to config.default_template. + * 3. Final safety net: full_content.twig. + * + * @param string $layout Requested layout key (e.g. 'left_sidebar') + * @return string Template name usable by the Twig loader + */ + public function getTemplateForLayout(string $layout): string { + $layout = trim($layout); + $templates = $this->getTemplates(); + + if ($layout !== '' && isset($templates[$layout])) { + $file = $templates[$layout]; + if ($this->templateExists($file)) { + return $file; + } + } + + $config = $this->getConfig(); + $default = $config['default_template'] ?? 'full_content'; + if (isset($templates[$default])) { + $file = $templates[$default]; + if ($this->templateExists($file)) { + return $file; + } + } + + return 'full_content.twig'; + } + + /** + * Get the list of available layout keys defined in the "template" section. + * + * @return array List of layout keys + */ + public function getLayouts(): array { + return array_keys($this->getTemplates()); + } + + /** + * Check whether a template file exists in the theme directory + */ + private function templateExists(string $file): bool { + $path = $this->themeDir . '/' . ltrim($file, '/'); + return is_file($path); + } + + /** + * Render a layout template with the given data. + * + * @param string $layout Requested layout key + * @param array $data Template variables + * @return string Rendered HTML + */ + public function render(string $layout, array $data): string { + $template = $this->getTemplateForLayout($layout); + return $this->twig->render($template, $data); + } + + /** + * Compile the theme's SCSS to CSS (cached by source mtime). + * + * @return string|null Absolute path to the compiled CSS, or null if none + */ + public function compileCss(): ?string { + $scssFile = $this->themeDir . '/css/theme.scss'; + if (!is_file($scssFile)) { + return null; + } + + $themeName = basename($this->themeDir); + $outDir = $this->compiledCssDir . '/' . $themeName; + $outFile = $outDir . '/theme.css'; + $cacheFile = $outDir . '/.mtime'; + + $mtime = filemtime($scssFile); + if (is_file($outFile) && is_file($cacheFile) && (int)file_get_contents($cacheFile) === $mtime) { + return $outFile; + } + + if (!is_dir($outDir)) { + mkdir($outDir, 0755, true); + } + + try { + $compiler = new Compiler(); + $compiler->setImportPaths($this->themeDir . '/css'); + $css = $compiler->compileString(file_get_contents($scssFile))->getCss(); + file_put_contents($outFile, $css); + file_put_contents($cacheFile, (string)$mtime); + return $outFile; + } catch (\Throwable $e) { + error_log('ThemeManager SCSS compile error: ' . $e->getMessage()); + return null; + } + } + + /** + * Get the public URL for the compiled theme CSS, or null if unavailable. + */ + public function getCssUrl(): ?string { + $compiled = $this->compileCss(); + if ($compiled === null) { + return null; + } + return '/themes/' . basename($this->themeDir) . '/theme.css'; + } + + /** + * Get the public URL for the theme JS, or null if unavailable. + */ + public function getJsUrl(): ?string { + $jsFile = $this->themeDir . '/js/theme.js'; + if (!is_file($jsFile)) { + return null; + } + return '/themes/' . basename($this->themeDir) . '/js/theme.js'; + } +} diff --git a/cms/core/config.php b/cms/core/config.php index 8440fc0..6b89eea 100644 --- a/cms/core/config.php +++ b/cms/core/config.php @@ -12,7 +12,6 @@ if (!file_exists($configJsonPath)) { $defaultConfig = [ 'site_title' => 'CodePress', 'content_dir' => 'content', - 'templates_dir' => 'cms/templates', 'active_theme' => 'default', 'default_page' => 'auto', 'language' => [ @@ -25,7 +24,7 @@ if (!file_exists($configJsonPath)) { ], 'author' => [ 'name' => 'E. Noorlander', - 'website' => 'https://noorlander.info' + 'website' => 'noorlander.info' ], 'show_version' => true, 'enabled_plugins' => ['MQTTTracker', 'HTMLBlock'], @@ -54,7 +53,29 @@ if (!file_exists($configJsonPath)) { 'geoip_api_url' => '', 'geoip_api_key' => '', 'retention_days' => 400, - 'excluded_ips' => [] + 'excluded_ips' => [ + '192.168.0.0/16', + '10.0.0.0/8', + '172.16.0.0/12', + '127.0.0.1', + '::1' + ] + ], + 'logging' => [ + 'enabled' => true, + 'driver' => 'sqlite', + 'syslog_host' => '', + 'syslog_port' => 514, + 'syslog_facility' => 'local0', + 'syslog_ident' => 'codepress', + 'events' => [ + 'admin' => true, + 'requests' => true, + 'errors' => true, + 'security' => true, + 'content' => true, + 'system' => true + ] ] ]; @file_put_contents($configJsonPath, json_encode($defaultConfig, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); @@ -88,25 +109,50 @@ if (file_exists($configJsonPath)) { 'geoip_api_url' => '', 'geoip_api_key' => '', 'retention_days' => 400, - 'excluded_ips' => [], + 'excluded_ips' => [ + '192.168.0.0/16', + '10.0.0.0/8', + '172.16.0.0/12', + '127.0.0.1', + '::1' + ], + ], + 'logging' => [ + 'enabled' => true, + 'driver' => 'sqlite', + 'syslog_host' => '', + 'syslog_port' => 514, + 'syslog_facility' => 'local0', + 'syslog_ident' => 'codepress', + 'events' => [ + 'admin' => true, + 'requests' => true, + 'errors' => true, + 'security' => true, + 'content' => true, + 'system' => true + ], ], ]; foreach ($sectionDefaults as $section => $defaults) { $config[$section] = array_merge($defaults, is_array($config[$section] ?? null) ? $config[$section] : []); } + // Ensure the private/loopback IP defaults are present when the list is empty + if (empty($config['analytics']['excluded_ips'])) { + $config['analytics']['excluded_ips'] = $sectionDefaults['analytics']['excluded_ips']; + } + // Convert relative paths to absolute $projectRoot = __DIR__ . '/../../'; if (isset($config['content_dir']) && strpos($config['content_dir'], '/') !== 0) { $config['content_dir'] = $projectRoot . $config['content_dir']; } - if (isset($config['templates_dir']) && strpos($config['templates_dir'], '/') !== 0) { - $config['templates_dir'] = $projectRoot . $config['templates_dir']; - } // Load active theme $activeTheme = $config['active_theme'] ?? 'default'; $themeDir = __DIR__ . '/../../themes/' . $activeTheme; + $config['theme_dir'] = $themeDir; $themeFile = $themeDir . '/theme.json'; if (file_exists($themeFile)) { $themeConfig = json_decode(file_get_contents($themeFile), true); @@ -123,6 +169,5 @@ if (file_exists($configJsonPath)) { return [ 'site_title' => 'CodePress', 'content_dir' => __DIR__ . '/../../content', - 'templates_dir' => __DIR__ . '/../templates', 'default_page' => 'auto' ]; \ No newline at end of file diff --git a/cms/core/index.php b/cms/core/index.php index 128ccaf..d3b305d 100644 --- a/cms/core/index.php +++ b/cms/core/index.php @@ -40,9 +40,11 @@ require_once 'class/RequestLogger.php'; require_once 'class/GeoIP.php'; require_once 'class/Analytics.php'; require_once 'class/SimpleTemplate.php'; +require_once 'class/ThemeManager.php'; // Load Logger class - structured logging with log levels require_once 'class/Logger.php'; +require_once 'class/LogManager.php'; // Load Plugin system require_once 'plugin/CMSAPI.php'; diff --git a/cms/router.php b/cms/router.php index ace1ce4..ce9de12 100644 --- a/cms/router.php +++ b/cms/router.php @@ -30,6 +30,26 @@ if (is_file($filePath)) { return true; } +// Serve theme assets from the themes/ directory (e.g. /themes/default/js/theme.js) +if (preg_match('#^/themes/([^/]+)/(.+)$#', $path, $m)) { + $themeName = $m[1]; + $themeRel = $m[2]; + $themesDir = __DIR__ . '/../themes'; + $themeFile = $themesDir . '/' . $themeName . '/' . $themeRel; + $realThemes = realpath($themesDir); + $realFile = realpath($themeFile); + if ($realFile && $realThemes && strpos($realFile, $realThemes) === 0 && is_file($realFile)) { + $ext = strtolower(pathinfo($realFile, PATHINFO_EXTENSION)); + if (isset($mimeTypes[$ext])) { + header('Content-Type: ' . $mimeTypes[$ext]); + } + readfile($realFile); + return true; + } + http_response_code(404); + return true; +} + // Admin routes: /admin/login → admin.php?route=login if (preg_match('#^/admin(?:/(.+))?$#', $path, $m)) { $_GET['route'] = $m[1] ?? 'dashboard'; diff --git a/cms/templates/html_content.mustache b/cms/templates/html_content.mustache deleted file mode 100644 index ca92073..0000000 --- a/cms/templates/html_content.mustache +++ /dev/null @@ -1,5 +0,0 @@ -
-
- {{{content}}} -
-
\ No newline at end of file diff --git a/cms/templates/layout.mustache b/cms/templates/layout.mustache deleted file mode 100644 index 0ea2fb2..0000000 --- a/cms/templates/layout.mustache +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - {{page_title}} - {{site_title}} - - - - - - - - - - - - - - - {{#block_ai_bots}} - - - {{/block_ai_bots}} - {{#block_search_engines}} - - {{/block_search_engines}} - - - - - - - - - - - - - - - - - - - - - - - - {{>header}} - - - - - -
- {{#sidebar_content}} - {{#equal layout "sidebar-content"}} -
- -
-
- {{>content_template}} -
-
-
- {{/equal}} - - {{#equal layout "content"}} -
-
-
- {{>content_template}} -
-
-
- {{/equal}} - - {{#equal layout "sidebar"}} -
- -
- {{/equal}} - - {{#equal layout "content-sidebar"}} -
-
-
- {{>content_template}} -
-
- -
- {{/equal}} - - {{#equal layout "content-sidebar-reverse"}} -
-
-
- {{>content_template}} -
-
- -
- {{/equal}} - {{/sidebar_content}} - {{^sidebar_content}} -
-
-
- {{>content_template}} -
-
-
- {{/sidebar_content}} -
- -
- {{>footer}} -
- - - - - \ No newline at end of file diff --git a/cms/templates/markdown_content.mustache b/cms/templates/markdown_content.mustache deleted file mode 100644 index d51360e..0000000 --- a/cms/templates/markdown_content.mustache +++ /dev/null @@ -1,5 +0,0 @@ -
-
- {{{content}}} -
-
\ No newline at end of file diff --git a/cms/templates/php_content.mustache b/cms/templates/php_content.mustache deleted file mode 100644 index b7dc2dc..0000000 --- a/cms/templates/php_content.mustache +++ /dev/null @@ -1,5 +0,0 @@ -
-
- {{{content}}} -
-
\ No newline at end of file diff --git a/composer.json b/composer.json index 4ebc5c9..7d5f02b 100644 --- a/composer.json +++ b/composer.json @@ -3,6 +3,8 @@ "mustache/mustache": "^3.0", "league/commonmark": "^2.7", "php-mqtt/client": "^2.0", - "geoip2/geoip2": "^2.13" + "geoip2/geoip2": "^2.13", + "twig/twig": "^3.28", + "scssphp/scssphp": "^2.1" } } diff --git a/composer.lock b/composer.lock index d098c64..abb80ae 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,80 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ca2f778e274e1087d5066837f53bcd23", + "content-hash": "6e4a8489683f5f6b5dc744684ad52fdf", "packages": [ + { + "name": "composer/ca-bundle", + "version": "1.5.13", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "c008272789979f709f7fcb32c2ecf1d2db5e84e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/c008272789979f709f7fcb32c2ecf1d2db5e84e5", + "reference": "c008272789979f709f7fcb32c2ecf1d2db5e84e5", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.5.13" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2026-07-18T12:35:13+00:00" + }, { "name": "dflydev/dot-access-data", "version": "v3.0.3", @@ -81,6 +153,64 @@ }, "time": "2024-07-08T12:26:09+00:00" }, + { + "name": "geoip2/geoip2", + "version": "v2.13.0", + "source": { + "type": "git", + "url": "https://github.com/maxmind/GeoIP2-php.git", + "reference": "6a41d8fbd6b90052bc34dff3b4252d0f88067b23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/6a41d8fbd6b90052bc34dff3b4252d0f88067b23", + "reference": "6a41d8fbd6b90052bc34dff3b4252d0f88067b23", + "shasum": "" + }, + "require": { + "ext-json": "*", + "maxmind-db/reader": "~1.8", + "maxmind/web-service-common": "~0.8", + "php": ">=7.2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "^8.0 || ^9.0", + "squizlabs/php_codesniffer": "3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "GeoIp2\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Gregory J. Oschwald", + "email": "goschwald@maxmind.com", + "homepage": "https://www.maxmind.com/" + } + ], + "description": "MaxMind GeoIP2 PHP API", + "homepage": "https://github.com/maxmind/GeoIP2-php", + "keywords": [ + "IP", + "geoip", + "geoip2", + "geolocation", + "maxmind" + ], + "support": { + "issues": "https://github.com/maxmind/GeoIP2-php/issues", + "source": "https://github.com/maxmind/GeoIP2-php/tree/v2.13.0" + }, + "time": "2022-08-05T20:32:58+00:00" + }, { "name": "league/commonmark", "version": "2.8.0", @@ -270,6 +400,303 @@ ], "time": "2022-12-11T20:36:23+00:00" }, + { + "name": "league/uri", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.8.1", + "php": "^8.1", + "psr/http-factory": "^1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-15T20:22:25+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-08T20:05:35+00:00" + }, + { + "name": "maxmind-db/reader", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git", + "reference": "2194f58d0f024ce923e685cdf92af3daf9951908" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/2194f58d0f024ce923e685cdf92af3daf9951908", + "reference": "2194f58d0f024ce923e685cdf92af3daf9951908", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "conflict": { + "ext-maxminddb": "<1.11.1 || >=2.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.*", + "phpstan/phpstan": "*", + "phpunit/phpunit": ">=8.0.0,<10.0.0", + "squizlabs/php_codesniffer": "4.*" + }, + "suggest": { + "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder", + "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder", + "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups", + "maxmind-db/reader-ext": "C extension for significantly faster IP lookups (install via PIE: pie install maxmind-db/reader-ext)" + }, + "type": "library", + "autoload": { + "psr-4": { + "MaxMind\\Db\\": "src/MaxMind/Db" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Gregory J. Oschwald", + "email": "goschwald@maxmind.com", + "homepage": "https://www.maxmind.com/" + } + ], + "description": "MaxMind DB Reader API", + "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php", + "keywords": [ + "database", + "geoip", + "geoip2", + "geolocation", + "maxmind" + ], + "support": { + "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues", + "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.13.1" + }, + "time": "2025-11-21T22:24:26+00:00" + }, + { + "name": "maxmind/web-service-common", + "version": "v0.11.1", + "source": { + "type": "git", + "url": "https://github.com/maxmind/web-service-common-php.git", + "reference": "c309236b5a5555b96cf560089ec3cead12d845d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/c309236b5a5555b96cf560089ec3cead12d845d2", + "reference": "c309236b5a5555b96cf560089ec3cead12d845d2", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.0.3", + "ext-curl": "*", + "ext-json": "*", + "php": ">=8.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "^10.0", + "squizlabs/php_codesniffer": "4.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "MaxMind\\Exception\\": "src/Exception", + "MaxMind\\WebService\\": "src/WebService" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Gregory Oschwald", + "email": "goschwald@maxmind.com" + } + ], + "description": "Internal MaxMind Web Service API", + "homepage": "https://github.com/maxmind/web-service-common-php", + "support": { + "issues": "https://github.com/maxmind/web-service-common-php/issues", + "source": "https://github.com/maxmind/web-service-common-php/tree/v0.11.1" + }, + "time": "2026-01-13T17:56:03+00:00" + }, { "name": "mustache/mustache", "version": "v3.0.0", @@ -647,6 +1074,114 @@ }, "time": "2019-01-08T18:20:26+00:00" }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://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" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, { "name": "psr/log", "version": "3.0.2", @@ -697,6 +1232,142 @@ }, "time": "2024-09-11T13:17:53+00:00" }, + { + "name": "scssphp/scssphp", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/scssphp/scssphp.git", + "reference": "d8450c2baf5fb07d00374999d0ea51276974d1b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scssphp/scssphp/zipball/d8450c2baf5fb07d00374999d0ea51276974d1b6", + "reference": "d8450c2baf5fb07d00374999d0ea51276974d1b6", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-mbstring": "*", + "league/uri": "^7.6", + "league/uri-interfaces": "^7.6", + "php": ">=8.1", + "scssphp/source-span": "^1.1", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "require-dev": { + "jgthms/bulma": "~0.9.4", + "jiripudil/phpstan-sealed-classes": "^1.3", + "phpstan/phpstan": "^2.1.31", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpunit/phpunit": "^9.5.6", + "sass/sass-spec": "*", + "squizlabs/php_codesniffer": "^3.13", + "symfony/phpunit-bridge": "^7.3 || ^8.0", + "symfony/polyfill-php84": "^1.33", + "symfony/var-dumper": "^6.4 || ^7.3 || ^8.0", + "thoughtbot/bourbon": "^7.0", + "twbs/bootstrap": "^5.3", + "twbs/bootstrap4": "4.6.1", + "zurb/foundation": "~6.7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ScssPhp\\ScssPhp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anthon Pang", + "email": "apang@softwaredevelopment.ca", + "homepage": "https://github.com/robocoder" + }, + { + "name": "Cédric Morin", + "email": "cedric@yterium.com", + "homepage": "https://github.com/Cerdic" + } + ], + "description": "scssphp is a compiler for SCSS written in PHP.", + "homepage": "https://scssphp.github.io/scssphp/", + "keywords": [ + "css", + "less", + "sass", + "scss", + "stylesheet" + ], + "support": { + "issues": "https://github.com/scssphp/scssphp/issues", + "source": "https://github.com/scssphp/scssphp/tree/v2.1.0" + }, + "time": "2025-11-21T17:27:59+00:00" + }, + { + "name": "scssphp/source-span", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/scssphp/source-span.git", + "reference": "37d653206daf11da1ee60b333984101bc4c27ba2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scssphp/source-span/zipball/37d653206daf11da1ee60b333984101bc4c27ba2", + "reference": "37d653206daf11da1ee60b333984101bc4c27ba2", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/uri": "^7.6", + "league/uri-interfaces": "^7.6", + "php": ">=8.1" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpunit/phpunit": "^9.5.6", + "squizlabs/php_codesniffer": "~3.5", + "symfony/phpunit-bridge": "^6.4 || ^7.3 || ^8.0", + "symfony/var-dumper": "^6.4 || ^7.3 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "SourceSpan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christophe Coevoet", + "homepage": "https://github.com/stof" + } + ], + "description": "Provides a representation for source code locations and spans.", + "keywords": [ + "parsing" + ], + "support": { + "issues": "https://github.com/scssphp/source-span/issues", + "source": "https://github.com/scssphp/source-span/tree/v1.1.0" + }, + "time": "2025-11-21T16:28:19+00:00" + }, { "name": "symfony/deprecation-contracts", "version": "v3.6.0", @@ -764,6 +1435,240 @@ ], "time": "2024-09-25T14:21:43+00:00" }, + { + "name": "symfony/filesystem", + "version": "v8.1.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "17856b7a222664a26a5ea1cb06ee0721c2438217" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/17856b7a222664a26a5ea1cb06ee0721c2438217", + "reference": "17856b7a222664a26a5ea1cb06ee0721c2438217", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "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": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v8.1.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-22T15:42:13+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.37.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "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" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-10T16:19:22+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "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" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "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" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, { "name": "symfony/polyfill-php80", "version": "v1.33.0", @@ -847,6 +1752,86 @@ } ], "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "twig/twig", + "version": "v3.28.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "597c12ed286fb9d1701a36684ce6e0cbe28ebc8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/597c12ed286fb9d1701a36684ce6e0cbe28ebc8b", + "reference": "597c12ed286fb9d1701a36684ce6e0cbe28ebc8b", + "shasum": "" + }, + "require": { + "php": ">=8.1.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" + }, + "require-dev": { + "php-cs-fixer/shim": "^3.0@stable", + "phpstan/phpstan": "^2.0@stable", + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.28.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2026-07-03T20:44:34+00:00" } ], "packages-dev": [], diff --git a/config.json.example b/config.json.example index 2575f04..43916d5 100644 --- a/config.json.example +++ b/config.json.example @@ -1,7 +1,6 @@ { "site_title": "CodePress", "content_dir": "content", - "templates_dir": "cms/templates", "active_theme": "default", "default_page": "auto", "language": { @@ -17,7 +16,7 @@ }, "author": { "name": "E. Noorlander", - "website": "https://noorlander.info" + "website": "noorlander.info" }, "show_version": true, "enabled_plugins": [ @@ -48,6 +47,29 @@ "geoip_mmdb_path": "", "geoip_api_url": "", "geoip_api_key": "", - "retention_days": 400 + "retention_days": 400, + "excluded_ips": [ + "192.168.0.0/16", + "10.0.0.0/8", + "172.16.0.0/12", + "127.0.0.1", + "::1" + ] + }, + "logging": { + "enabled": true, + "driver": "sqlite", + "syslog_host": "", + "syslog_port": 514, + "syslog_facility": "local0", + "syslog_ident": "codepress", + "events": { + "admin": true, + "requests": true, + "errors": true, + "security": true, + "content": true, + "system": true + } } } diff --git a/docs/TODO.md b/docs/TODO.md index 0b9f8fb..52ffb28 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -27,7 +27,7 @@ - [x] **Breadcrumb titels ongeescaped** - `$title` direct in HTML zonder `htmlspecialchars()` (`CodePressCMS.php:1197`) - [x] **Zoekresultaat-URLs missen `&lang=`** - Taalparameter ontbreekt (`CodePressCMS.php:264`) - [x] **Operator precedence bug** - `!$x ?? true` evalueert als `(!$x) ?? true` (`MQTTTracker.php:131`) -- [ ] **Taalwisselaar verliest pagina** - Wisselen van taal navigeert altijd naar homepage (`header.mustache:22`) +- [ ] **Taalwisselaar verliest pagina** - Wisselen van taal navigeert altijd naar homepage (`partials/header.twig`) - [ ] **ctime is geen creatietijd op Linux** - `stat()` ctime is inode-wijzigingstijd (`CodePressCMS.php:400`) - [ ] **getGuidePage() dupliceert markdown parsing** - Zelfde CommonMark setup als `parseMarkdown()` (`CodePressCMS.php:854`) - [ ] **HTMLBlock ontbrekende `
`** - Niet-gesloten tags bij null-check (`HTMLBlock.php:68`) @@ -36,7 +36,7 @@ ## Laag - [x] **Hardcoded 'Ga naar'** - Niet vertaalbaar in `autoLinkPageTitles()` (`CodePressCMS.php:587`) -- [x] **HTML lang attribuut** - `` hardcoded i.p.v. dynamisch (`layout.mustache:2`) +- [x] **HTML lang attribuut** - `` hardcoded i.p.v. dynamisch (`base.twig`) - [x] **console.log in productie** - Debug log in app.js (`app.js:54`) - [x] **Event listener leak** - N globale click listeners in forEach loop (`app.js:85`) - [x] **Sidebar toggle aria** - Ontbrekende `aria-label` en `aria-expanded` (`CodePressCMS.php:1171`) diff --git a/guide/en.codepress.md b/guide/en.codepress.md index 333426d..0da7af6 100644 --- a/guide/en.codepress.md +++ b/guide/en.codepress.md @@ -58,8 +58,8 @@ codepress/ │ ├── core/ │ │ ├── class/ │ │ │ ├── CodePressCMS.php # Main CMS class (content, navigation, search) +│ │ │ ├── ThemeManager.php # Theme resolver + Twig render + SCSS compile │ │ │ ├── Logger.php # Structured logging system -│ │ │ ├── SimpleTemplate.php # Mustache-style template engine │ │ │ ├── Analytics.php # Visitor statistics │ │ │ ├── BotGuard.php # Bot/AI/scraper detection │ │ │ ├── GeoIP.php # Country lookup by IP @@ -73,13 +73,21 @@ codepress/ │ ├── lang/ # Language files │ │ ├── nl.php # Dutch translations │ │ └── en.php # English translations -│ ├── templates/ # Mustache templates -│ │ ├── layout.mustache # Main layout (CSS, structure) -│ │ ├── assets/ # Header, navigation, footer partials -│ │ ├── markdown_content.mustache -│ │ ├── php_content.mustache -│ │ └── html_content.mustache -│ └── router.php # PHP dev server router +│ └── router.php # PHP dev server router (also serves /themes/) +├── themes/ # Dynamic themes (fully self-contained) +│ ├── default/ # Default theme +│ │ ├── theme.json # { title, config.default_template, template→.twig mapping } +│ │ ├── base.twig # Main layout (head, header, nav, footer) +│ │ ├── full_content.twig # Layout: full width +│ │ ├── left_sidebar.twig # Layout: sidebar left +│ │ ├── right_sidebar.twig # Layout: sidebar right +│ │ ├── custom1.twig # Layout: custom +│ │ ├── partials/ # header.twig, navigation.twig, footer.twig +│ │ ├── css/theme.scss # Colors, heights, background (compiled at runtime) +│ │ ├── js/theme.js # Theme JavaScript +│ │ └── theme.png # Preview image +│ ├── demo/ # Demo theme (same structure, different look) +│ └── test/ # Test theme ├── admin/ # Admin panel │ ├── config/ │ │ ├── app.php # Admin app configuration (paths, timezone) @@ -124,12 +132,19 @@ codepress/ │ ├── assets/ # CSS, JS, favicons │ │ ├── codemirror/ # CodeMirror editor (minified JS/CSS) │ │ └── css/js/ # Bootstrap, icons, app CSS/JS -│ ├── themes/ # Uploaded theme backgrounds +│ ├── themes/ # Runtime compiled theme CSS (public/themes) │ └── manifest.json / sw.js # PWA support -├── themes/ # Theme definitions +├── themes/ # Dynamic themes (fully self-contained) │ ├── default/ # Default theme -│ │ └── theme.json # Colors, heights, background -│ └── ... # Other themes +│ │ ├── theme.json # Title, default template, template mapping +│ │ ├── base.twig # Main layout +│ │ ├── *.twig # Layout templates (full_content, left_sidebar, ...) +│ │ ├── partials/ # header, navigation, footer +│ │ ├── css/theme.scss # Colors, heights, background +│ │ ├── js/theme.js # Theme JavaScript +│ │ └── theme.png # Preview image +│ ├── demo/ # Demo theme +│ └── test/ # Test theme ├── config.json # Site configuration ├── version.php # Version information └── vendor/ # Composer dependencies @@ -301,7 +316,6 @@ This is useful for your own IP address or internal monitoring tools. { "site_title": "CodePress", "content_dir": "content", - "templates_dir": "cms\/templates", "default_page": "index", "active_theme": "default", "language": { @@ -336,32 +350,64 @@ This is useful for your own IP address or internal monitoring tools. ### Themes -Themes are managed via the admin panel at `/admin/theme`. You can create, activate, adjust colors, upload background images, and delete themes. +Themes are managed via the admin panel at `/admin/theme`. This is a selection page: pick the active theme and click "Activate theme". Each theme is a fully self-contained folder in `themes/` with its own Twig templates, SCSS and JavaScript. + +#### Theme structure (`themes//`) + +``` +themes// +├── theme.json # Title, default template, template mapping +├── base.twig # Main layout (head, header, nav, footer) +├── full_content.twig # Layout: full width +├── left_sidebar.twig # Layout: sidebar left +├── right_sidebar.twig # Layout: sidebar right +├── custom1.twig # Layout: custom +├── partials/ # header.twig, navigation.twig, footer.twig +├── css/theme.scss # Colors, heights, background (compiled at runtime) +├── js/theme.js # Theme JavaScript +└── theme.png # Preview image (shown in admin) +``` #### Theme Configuration (`themes//theme.json`) ```json { - "name": "Default", - "header_color": "#0a369d", - "header_font_color": "#ffffff", - "header_height": "56", - "navigation_color": "#2754b4", - "navigation_font_color": "#ffffff", - "nav_height": "42", - "sidebar_background": "#f8f9fa", - "sidebar_border": "#dee2e6", - "background_image": "", - "background_image_opacity": "100" + "title": "default", + "config": { + "default_template": "full_content" + }, + "template": { + "full_content": "full_content.twig", + "left_sidebar": "left_sidebar.twig", + "right_sidebar": "right_sidebar.twig", + "custom1": "custom1.twig" + } } ``` +- **`config.default_template`**: the default template used when a page requests an unknown layout. +- **`template`**: the layout-key → `.twig` file mapping. A theme can have multiple template pages. + +Colors, heights and background are **not** set in `theme.json` but in `css/theme.scss`: + +```scss +$header-bg: #0a369d; +$header-font: #ffffff; +$header-height: 56px; +$nav-bg: #2754b4; +$nav-font: #ffffff; +$nav-height: 42px; +$sidebar-bg: #f8f9fa; +$sidebar-border: #dee2e6; +$header-bg-image: none; // optional header background +$header-bg-opacity: 1; +``` + +The SCSS is compiled at runtime into `public/themes//theme.css`. + #### How to create a new theme -1. Go to `/admin/theme` -2. Enter a name and click "Create" -3. Adjust colors, heights and background -4. Activate the theme +Themes are created manually: copy the `themes/default/` folder to `themes//`, adjust the SCSS colors and templates, and add a `theme.png` preview. The theme is then available on `/admin/theme` to activate. ### Security @@ -418,10 +464,23 @@ Country detection via three sources: ### Logging -The admin console maintains two logs, viewable at `/admin/logs`: +The admin console maintains logs, viewable at `/admin/logs`: - **Activity log** (`admin/storage/logs/admin.log`) — admin actions like creating, editing, deleting pages, enabling/disabling plugins, changing configuration. - **Request log** (`admin/storage/logs/requests.log`) — every page view on the website, including IP, page, domain, language, user agent, and referrer. +- **Dynamic log** — structured log entries via `LogManager`, with event type, level, IP, and message. + +#### Configuring dynamic logging + +Via `/admin/config` → **Logging** you can configure how and what is recorded: + +- **Storage**: `SQLite` (default) or `Syslog`. +- **Syslog server**: if a host is provided, log entries are sent to that server over UDP. Leave empty to use SQLite. +- **Facility**: the category of the log source in syslog. `local0`–`local7` are for your own applications; `daemon`, `user`, and `auth` are standard system categories. +- **Syslog ident**: the name that appears in the log message (e.g. `codepress`). +- **Events**: choose which types are recorded — `admin`, `requests`, `errors`, `security`, `content`, `system`. + +If no syslog server is configured, SQLite is always used (with a file fallback if SQLite is unavailable). The dashboard shows the last 20 entries of each log. Click "View all →" for the full list, where you can also download or clear. @@ -523,6 +582,8 @@ This guide is also built into the admin panel via `/admin/guide`, with support f ### Templates +Templates are Twig files per theme in `themes//`. `ThemeManager` renders them and compiles `css/theme.scss` at runtime into `public/themes//theme.css`. + #### Template Variables **Site Info** - `site_title`, `author_name`, `author_website`, `author_git` @@ -531,36 +592,39 @@ This guide is also built into the admin panel via `/admin/guide`, with support f **Navigation** - `menu`, `breadcrumb`, `homepage` -**Theme (from theme.json)** - `header_color`, `header_font_color`, `header_height`, `navigation_color`, `navigation_font_color`, `nav_height`, `sidebar_background`, `sidebar_border`, `background_image_css`, `background_image_opacity` +**Theme** - `theme_title`, `theme_css_url`, `theme_js_url`, `theme_config` (config from theme.json) **Language** - `current_lang`, `current_lang_upper`, `t_*` (translated strings) #### Layout Options -Use YAML frontmatter to select layout: +Use YAML frontmatter to select the template. The layout key references a template in the active theme: ```yaml --- title: My Page -layout: sidebar-content +layout: left_sidebar plugins: HTMLBlock --- ``` #### Available Layouts -- `sidebar-content` - Sidebar left, content right (default) -- `content` - Content only (full width) -- `sidebar` - Sidebar only -- `content-sidebar` - Content left, sidebar right -- `content-sidebar-reverse` - Content right, sidebar left +The available layouts are defined by the `template` section of the active theme (`themes//theme.json`). The default theme includes: + +- `full_content` - Content only (full width) +- `left_sidebar` - Sidebar left, content right +- `right_sidebar` - Content left, sidebar right +- `custom1` - Custom layout + +If a page requests an unknown layout, the `default_template` from the theme's `config` is used. #### Meta Data ```yaml --- title: Page Title -layout: content-sidebar +layout: left_sidebar description: Page description author: Author Name date: 2025-11-26 diff --git a/guide/nl.codepress.md b/guide/nl.codepress.md index 23f839c..7b3a354 100644 --- a/guide/nl.codepress.md +++ b/guide/nl.codepress.md @@ -58,8 +58,8 @@ codepress/ │ ├── core/ │ │ ├── class/ │ │ │ ├── CodePressCMS.php # Hoofd CMS class (content, navigatie, search) +│ │ │ ├── ThemeManager.php # Thema-resolver + Twig render + SCSS compile │ │ │ ├── Logger.php # Gestructureerd logging systeem -│ │ │ ├── SimpleTemplate.php # Mustache-style template engine │ │ │ ├── Analytics.php # Bezoekersstatistieken │ │ │ ├── BotGuard.php # Bot/AI/scraper detectie │ │ │ ├── GeoIP.php # Landbepaling op basis van IP @@ -73,13 +73,21 @@ codepress/ │ ├── lang/ # Taalbestanden │ │ ├── nl.php # Nederlandse vertalingen │ │ └── en.php # Engelse vertalingen -│ ├── templates/ # Mustache templates -│ │ ├── layout.mustache # Hoofd layout (CSS, structuur) -│ │ ├── assets/ # Header, navigation, footer partials -│ │ ├── markdown_content.mustache -│ │ ├── php_content.mustache -│ │ └── html_content.mustache -│ └── router.php # PHP dev server router +│ └── router.php # PHP dev server router (serveert ook /themes/) +├── themes/ # Dynamische thema's (volledig zelfstandig) +│ ├── default/ # Standaard thema +│ │ ├── theme.json # { title, config.default_template, template→.twig mapping } +│ │ ├── base.twig # Hoofd layout (head, header, nav, footer) +│ │ ├── full_content.twig # Layout: volledige breedte +│ │ ├── left_sidebar.twig # Layout: sidebar links +│ │ ├── right_sidebar.twig # Layout: sidebar rechts +│ │ ├── custom1.twig # Layout: custom +│ │ ├── partials/ # header.twig, navigation.twig, footer.twig +│ │ ├── css/theme.scss # Kleuren, hoogtes, achtergrond (runtime gecompileerd) +│ │ ├── js/theme.js # Thema JavaScript +│ │ └── theme.png # Voorbeeldafbeelding +│ ├── demo/ # Demo thema (zelfde structuur, andere look) +│ └── test/ # Test thema ├── admin/ # Admin paneel │ ├── config/ │ │ ├── app.php # Admin app configuratie (paden, timezone) @@ -124,12 +132,19 @@ codepress/ │ ├── assets/ # CSS, JS, favicons │ │ ├── codemirror/ # CodeMirror editor (minified JS/CSS) │ │ └── css/js/ # Bootstrap, icons, app CSS/JS -│ ├── themes/ # Geuploade theme achtergronden +│ ├── themes/ # Runtime gecompileerde thema CSS (public/themes) │ └── manifest.json / sw.js # PWA ondersteuning -├── themes/ # Thema definities +├── themes/ # Dynamische thema's (volledig zelfstandig) │ ├── default/ # Standaard thema -│ │ └── theme.json # Kleuren, hoogtes, achtergrond -│ └── ... # Andere thema's +│ │ ├── theme.json # Titel, default template, template mapping +│ │ ├── base.twig # Hoofd layout +│ │ ├── *.twig # Layout-sjablonen (full_content, left_sidebar, ...) +│ │ ├── partials/ # header, navigation, footer +│ │ ├── css/theme.scss # Kleuren, hoogtes, achtergrond +│ │ ├── js/theme.js # Thema JavaScript +│ │ └── theme.png # Voorbeeldafbeelding +│ ├── demo/ # Demo thema +│ └── test/ # Test thema ├── config.json # Site configuratie ├── version.php # Versie informatie └── vendor/ # Composer dependencies @@ -302,7 +317,6 @@ Dit is handig voor je eigen IP-adres of dat van interne monitoring tools. { "site_title": "CodePress", "content_dir": "content", - "templates_dir": "cms\/templates", "default_page": "index", "active_theme": "default", "language": { @@ -337,32 +351,64 @@ Dit is handig voor je eigen IP-adres of dat van interne monitoring tools. ### Thema's -Thema's worden beheerd via het admin paneel op `/admin/theme`. Je kunt thema's aanmaken, activeren, kleuren aanpassen, achtergrondafbeeldingen uploaden en verwijderen. +Thema's worden beheerd via het admin paneel op `/admin/theme`. Dit is een selectiepagina: kies het actieve thema en klik "Thema activeren". Elk thema is een volledig zelfstandige map in `themes/` met eigen Twig-sjablonen, SCSS en JavaScript. + +#### Thema-structuur (`themes//`) + +``` +themes// +├── theme.json # Titel, default template, template mapping +├── base.twig # Hoofd layout (head, header, nav, footer) +├── full_content.twig # Layout: volledige breedte +├── left_sidebar.twig # Layout: sidebar links +├── right_sidebar.twig # Layout: sidebar rechts +├── custom1.twig # Layout: custom +├── partials/ # header.twig, navigation.twig, footer.twig +├── css/theme.scss # Kleuren, hoogtes, achtergrond (runtime gecompileerd) +├── js/theme.js # Thema JavaScript +└── theme.png # Voorbeeldafbeelding (tonen in admin) +``` #### Thema Configuratie (`themes//theme.json`) ```json { - "name": "Standaard", - "header_color": "#0a369d", - "header_font_color": "#ffffff", - "header_height": "56", - "navigation_color": "#2754b4", - "navigation_font_color": "#ffffff", - "nav_height": "42", - "sidebar_background": "#f8f9fa", - "sidebar_border": "#dee2e6", - "background_image": "", - "background_image_opacity": "100" + "title": "default", + "config": { + "default_template": "full_content" + }, + "template": { + "full_content": "full_content.twig", + "left_sidebar": "left_sidebar.twig", + "right_sidebar": "right_sidebar.twig", + "custom1": "custom1.twig" + } } ``` +- **`config.default_template`**: de standaard sjabloon die gebruikt wordt wanneer een pagina een onbekende layout vraagt. +- **`template`**: de layout-sleutel → `.twig`-bestand koppeling. Zo kan een thema meerdere template-pagina's hebben. + +Kleuren, hoogtes en achtergrond worden **niet** in `theme.json` gezet, maar in `css/theme.scss`: + +```scss +$header-bg: #0a369d; +$header-font: #ffffff; +$header-height: 56px; +$nav-bg: #2754b4; +$nav-font: #ffffff; +$nav-height: 42px; +$sidebar-bg: #f8f9fa; +$sidebar-border: #dee2e6; +$header-bg-image: none; // optionele header-achtergrond +$header-bg-opacity: 1; +``` + +De SCSS wordt runtime gecompileerd naar `public/themes//theme.css`. + #### Een nieuw thema maken -1. Ga naar `/admin/theme` -2. Voer een naam in en klik "Aanmaken" -3. Pas kleuren, hoogtes en achtergrond aan -4. Activeer het thema +Thema's zijn handmatig aan te maken: kopieer de `themes/default/` map naar `themes//`, pas de SCSS-kleuren en sjablonen aan, en voeg een `theme.png` preview toe. Daarna is het thema beschikbaar op `/admin/theme` om te activeren. ### Beveiliging @@ -419,10 +465,23 @@ Landbepaling kan via drie bronnen: ### Logging -De admin console houdt twee logs bij, te bekijken via `/admin/logs`: +De admin console houdt logs bij, te bekijken via `/admin/logs`: - **Activiteiten log** (`admin/storage/logs/admin.log`) — admin acties zoals pagina's aanmaken, bewerken, verwijderen, plugin in/uitschakelen, configuratie wijzigen. - **Requests log** (`admin/storage/logs/requests.log`) — elke pageview op de website, met IP, pagina, domein, taal, user-agent en referrer. +- **Dynamisch log** — gestructureerde logregels via `LogManager`, met gebeurtenistype, niveau, IP en bericht. + +#### Dynamische logging configureren + +Via `/admin/config` → **Logging** kun je instellen hoe en wat er geregistreerd wordt: + +- **Opslag**: `SQLite` (standaard) of `Syslog`. +- **Syslog server**: als er een host is opgegeven, worden logregels via UDP naar die server gestuurd. Laat leeg om SQLite te gebruiken. +- **Facility**: de categorie van de logbron in syslog. `local0`–`local7` zijn bedoeld voor eigen applicaties; `daemon`, `user` en `auth` zijn standaard systeemcategorieën. +- **Syslog ident**: de naam die in het logbericht verschijnt (bijv. `codepress`). +- **Gebeurtenissen**: kies welke types geregistreerd worden — `admin`, `requests`, `errors`, `security`, `content`, `system`. + +Als er geen syslog-server is opgegeven, wordt altijd SQLite gebruikt (met een bestands-fallback als SQLite niet beschikbaar is). Het dashboard toont de laatste 20 entries van elk log. Klik "Bekijk alle →" voor de volledige lijst, waar je ook kunt downloaden of wissen. @@ -524,6 +583,8 @@ Deze handleiding is ook ingebouwd in het admin paneel via `/admin/guide`, met on ### Templates +Sjablonen zijn Twig-bestanden die per thema in `themes//` staan. `ThemeManager` rendert ze en compileert `css/theme.scss` runtime naar `public/themes//theme.css`. + #### Template Variabelen **Site Info** - `site_title`, `author_name`, `author_website`, `author_git` @@ -532,36 +593,39 @@ Deze handleiding is ook ingebouwd in het admin paneel via `/admin/guide`, met on **Navigation** - `menu`, `breadcrumb`, `homepage` -**Theme (uit theme.json)** - `header_color`, `header_font_color`, `header_height`, `navigation_color`, `navigation_font_color`, `nav_height`, `sidebar_background`, `sidebar_border`, `background_image_css`, `background_image_opacity` +**Theme** - `theme_title`, `theme_css_url`, `theme_js_url`, `theme_config` (config uit theme.json) **Language** - `current_lang`, `current_lang_upper`, `t_*` (vertaalde strings) #### Layout Opties -Gebruik YAML frontmatter om layout te selecteren: +Gebruik YAML frontmatter om de sjabloon te selecteren. De layout-sleutel verwijst naar een template in het actieve thema: ```yaml --- title: Mijn Pagina -layout: sidebar-content +layout: left_sidebar plugins: HTMLBlock --- ``` #### Beschikbare Layouts -- `sidebar-content` - Sidebar links, content rechts (standaard) -- `content` - Alleen content (volle breedte) -- `sidebar` - Alleen sidebar -- `content-sidebar` - Content links, sidebar rechts -- `content-sidebar-reverse` - Content rechts, sidebar links +De beschikbare layouts worden bepaald door de `template`-sectie van het actieve thema (`themes//theme.json`). Het standaard thema bevat: + +- `full_content` - Alleen content (volle breedte) +- `left_sidebar` - Sidebar links, content rechts +- `right_sidebar` - Content links, sidebar rechts +- `custom1` - Custom layout + +Vraag een pagina een onbekende layout aan, dan wordt de `default_template` uit `config` van het thema gebruikt. #### Meta Data ```yaml --- title: Pagina Titel -layout: content-sidebar +layout: left_sidebar description: Pagina beschrijving author: Auteur Naam date: 2025-11-26 diff --git a/plugins/test/README.md b/plugins/test/README.md deleted file mode 100644 index 152cb1e..0000000 --- a/plugins/test/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# test - -Dit is een test plugin diff --git a/plugins/test/config.json b/plugins/test/config.json deleted file mode 100644 index c26ec9a..0000000 --- a/plugins/test/config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "enabled": true -} \ No newline at end of file diff --git a/plugins/test/test.php b/plugins/test/test.php deleted file mode 100644 index a42a5dd..0000000 --- a/plugins/test/test.php +++ /dev/null @@ -1,35 +0,0 @@ -config = [ - 'title' => 'Dit is een test plugin', - 'viewable' => true, - ]; - } - - public function setAPI(CMSAPI $api): void - { - $this->api = $api; - } - - public function getSidebarContent(): string - { - return 'Hallo'; - } - - public function getConfig(): array - { - return $this->config; - } - - public function setConfig(array $config): void - { - $this->config = array_merge($this->config, $config); - } -} \ No newline at end of file diff --git a/public/admin.php b/public/admin.php index f583c71..68c13c0 100644 --- a/public/admin.php +++ b/public/admin.php @@ -26,6 +26,13 @@ require_once __DIR__ . '/../cms/core/class/BotGuard.php'; require_once __DIR__ . '/../cms/core/class/Cache.php'; require_once __DIR__ . '/../cms/core/class/GeoIP.php'; require_once __DIR__ . '/../cms/core/class/Analytics.php'; +require_once __DIR__ . '/../cms/core/class/LogManager.php'; + +// Initialize dynamic logging from site config +$siteConfigForLogging = file_exists($appConfig['config_json']) + ? (json_decode(file_get_contents($appConfig['config_json']), true) ?? []) + : []; +LogManager::init($siteConfigForLogging['logging'] ?? []); $auth = new AdminAuth($appConfig); @@ -108,6 +115,14 @@ switch ($route) { handleTheme($auth, $appConfig); break; + case 'theme-new': + handleThemeNew($auth, $appConfig); + break; + + case 'theme-delete': + handleThemeDelete($auth, $appConfig); + break; + case 'plugins': handlePlugins($auth, $appConfig); break; @@ -328,6 +343,11 @@ function adminLog(array $config, string $level, string $message): void $timestamp = date('Y-m-d H:i:s'); $ip = RequestLogger::getClientIp(); @file_put_contents($logFile, "[{$timestamp}] [{$level}] [{$ip}] {$message}\n", FILE_APPEND); + + // Also record through the dynamic log manager (admin event) + if (class_exists('LogManager')) { + LogManager::log(LogManager::EVENT_ADMIN, $level, $message, ['ip' => $ip]); + } } function handleContentEdit(AdminAuth $auth, array $config): void @@ -410,6 +430,18 @@ function handleContentEdit(AdminAuth $auth, array $config): void $currentLayout = 'sidebar-content'; } + // Load available layouts from the active theme's theme.json + $themeLayouts = []; + $configJson = $config['config_json']; + $configData = file_exists($configJson) ? json_decode(file_get_contents($configJson), true) : []; + if (!is_array($configData)) $configData = []; + $activeThemeName = $configData['active_theme'] ?? 'default'; + $activeThemeFile = $config['codepress_root'] . '/themes/' . $activeThemeName . '/theme.json'; + if (file_exists($activeThemeFile)) { + $themeJson = json_decode(file_get_contents($activeThemeFile), true) ?? []; + $themeLayouts = $themeJson['template'] ?? []; + } + $fileName = basename($filePath); $route = 'content-edit'; @@ -522,6 +554,18 @@ function handleContentNew(AdminAuth $auth, array $config): void } } + // Load available layouts from the active theme's .twig files + $themeLayouts = []; + $configJson = $config['config_json']; + $configData = file_exists($configJson) ? json_decode(file_get_contents($configJson), true) : []; + if (!is_array($configData)) $configData = []; + $activeThemeName = $configData['active_theme'] ?? 'default'; + $activeThemeFile = $config['codepress_root'] . '/themes/' . $activeThemeName . '/theme.json'; + if (file_exists($activeThemeFile)) { + $themeJson = json_decode(file_get_contents($activeThemeFile), true) ?? []; + $themeLayouts = $themeJson['template'] ?? []; + } + $route = 'content-new'; require __DIR__ . '/../admin/templates/layout.php'; } @@ -748,7 +792,7 @@ function handleConfig(AdminAuth $auth, array $config): void $configData['seo']['description'] = trim($_POST['seo_description'] ?? ''); $configData['seo']['keywords'] = trim($_POST['seo_keywords'] ?? ''); $configData['author']['name'] = trim($_POST['author_name'] ?? ''); - $configData['author']['website'] = trim($_POST['author_website'] ?? ''); + $configData['author']['website'] = stripUrlScheme(trim($_POST['author_website'] ?? '')); $configData['show_version'] = !empty($_POST['show_version']); $configData['features']['auto_link_pages'] = !empty($_POST['feature_auto_link']); $configData['features']['search_enabled'] = !empty($_POST['feature_search']); @@ -767,6 +811,20 @@ function handleConfig(AdminAuth $auth, array $config): void }; $configData['analytics']['excluded_ips'] = $parseLines($_POST['excluded_ips'] ?? ''); + // Logging settings + $configData['logging']['enabled'] = !empty($_POST['logging_enabled']); + $configData['logging']['driver'] = ($_POST['logging_driver'] ?? 'sqlite') === 'syslog' ? 'syslog' : 'sqlite'; + $configData['logging']['syslog_host'] = trim($_POST['syslog_host'] ?? ''); + $configData['logging']['syslog_port'] = max(1, min(65535, (int)($_POST['syslog_port'] ?? 514))); + $configData['logging']['syslog_facility'] = preg_replace('/[^a-z0-9]/', '', $_POST['syslog_facility'] ?? 'local0'); + $configData['logging']['syslog_ident'] = trim($_POST['syslog_ident'] ?? 'codepress'); + $selectedEvents = $_POST['logging_events'] ?? []; + $allEvents = ['admin', 'requests', 'errors', 'security', 'content', 'system']; + $configData['logging']['events'] = []; + foreach ($allEvents as $ev) { + $configData['logging']['events'][$ev] = in_array($ev, $selectedEvents, true); + } + file_put_contents($configJson, json_encode($configData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); adminLog($config, 'info', $user['username'] . ' wijzigde site configuratie'); $message = 'Configuratie opgeslagen.'; @@ -993,115 +1051,19 @@ function handleTheme(AdminAuth $auth, array $config): void $csrf = $auth->getCsrfToken(); $configJson = $config['config_json']; $themesDir = $config['codepress_root'] . '/themes'; - $publicThemes = $config['codepress_root'] . '/public/themes'; $message = ''; $messageType = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { - if (!$auth->verifyCsrf($_POST['csrf_token'] ?? '')) { - $message = 'Ongeldige CSRF token.'; - $messageType = 'danger'; - } else { - $action = $_POST['action'] ?? ''; - - if ($action === 'save') { - $themeName = preg_replace('/[^a-zA-Z0-9_-]/', '', $_POST['theme'] ?? ''); - $themeFile = $themesDir . '/' . $themeName . '/theme.json'; - if (file_exists($themeFile)) { - $themeData = json_decode(file_get_contents($themeFile), true) ?? []; - foreach (['header_color', 'header_font_color', 'navigation_color', 'navigation_font_color', 'sidebar_background', 'sidebar_border'] as $field) { - $value = trim($_POST[$field] ?? ''); - if (preg_match('/^#[0-9a-fA-F]{6}$/', $value)) { - $themeData[$field] = $value; - } - } - $themeData['name'] = trim($_POST['theme_name'] ?? $themeData['name'] ?? $themeName); - $themeData['header_height'] = preg_match('/^\d+$/', $_POST['header_height'] ?? '') ? trim($_POST['header_height']) : ($themeData['header_height'] ?? '56'); - $themeData['nav_height'] = preg_match('/^\d+$/', $_POST['nav_height'] ?? '') ? trim($_POST['nav_height']) : ($themeData['nav_height'] ?? '42'); - $themeData['background_image_opacity'] = preg_match('/^\d+$/', $_POST['background_image_opacity'] ?? '') ? max(0, min(100, intval($_POST['background_image_opacity']))) : ($themeData['background_image_opacity'] ?? '100'); - - // Handle background image upload - if (!empty($_FILES['bg_image']['name']) && $_FILES['bg_image']['error'] === UPLOAD_ERR_OK) { - $ext = strtolower(pathinfo($_FILES['bg_image']['name'], PATHINFO_EXTENSION)); - if (in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'])) { - $imgName = $themeName . '_bg.' . $ext; - if (!is_dir($publicThemes)) mkdir($publicThemes, 0755, true); - move_uploaded_file($_FILES['bg_image']['tmp_name'], $publicThemes . '/' . $imgName); - $themeData['background_image'] = $imgName; - } - } - // Handle background image URL - $bgUrl = trim($_POST['background_image_url'] ?? ''); - if (!empty($bgUrl)) { - $themeData['background_image'] = $bgUrl; - } - // Handle background image removal - if (!empty($_POST['bg_image_remove'])) { - if ($themeData['background_image'] ?? '') { - $oldFile = $publicThemes . '/' . $themeData['background_image']; - if (file_exists($oldFile)) unlink($oldFile); - } - $themeData['background_image'] = ''; - } - - file_put_contents($themeFile, json_encode($themeData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); - $message = 'Thema opgeslagen.'; - $messageType = 'success'; - } - } elseif ($action === 'activate') { - $themeName = preg_replace('/[^a-zA-Z0-9_-]/', '', $_POST['theme'] ?? ''); - if (file_exists($themesDir . '/' . $themeName . '/theme.json')) { - $cfg = json_decode(file_get_contents($configJson), true) ?? []; - $cfg['active_theme'] = $themeName; - file_put_contents($configJson, json_encode($cfg, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); - $message = 'Thema geactiveerd.'; - $messageType = 'success'; - } - } elseif ($action === 'create') { - $newName = preg_replace('/[^a-zA-Z0-9_-]/', '', $_POST['new_name'] ?? ''); - if (empty($newName)) { - $message = 'Geef een naam voor het nieuwe thema.'; - $messageType = 'danger'; - } elseif (file_exists($themesDir . '/' . $newName . '/theme.json')) { - $message = 'Thema bestaat al.'; - $messageType = 'danger'; - } else { - $defaults = [ - 'name' => $newName, - 'header_color' => '#0a369d', - 'header_font_color' => '#ffffff', - 'header_height' => '56', - 'navigation_color' => '#2754b4', - 'navigation_font_color' => '#ffffff', - 'nav_height' => '42', - 'sidebar_background' => '#f8f9fa', - 'sidebar_border' => '#dee2e6', - 'background_image' => '', - 'background_image_opacity' => '100', - ]; - $newThemeDir = $themesDir . '/' . $newName; - mkdir($newThemeDir, 0755, true); - file_put_contents($newThemeDir . '/theme.json', json_encode($defaults, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); - $message = 'Thema aangemaakt.'; - $messageType = 'success'; - } - } elseif ($action === 'delete') { - $themeName = preg_replace('/[^a-zA-Z0-9_-]/', '', $_POST['theme'] ?? ''); - $themeDir = $themesDir . '/' . $themeName; - if (is_dir($themeDir) && $themeName !== 'default') { - $themeFile = $themeDir . '/theme.json'; - if (file_exists($themeFile)) unlink($themeFile); - // Remove theme directory if empty - $remaining = array_diff(scandir($themeDir), ['.', '..']); - if (empty($remaining)) rmdir($themeDir); - $cfg = json_decode(file_get_contents($configJson), true) ?? []; - if (($cfg['active_theme'] ?? '') === $themeName) { - $cfg['active_theme'] = 'default'; - file_put_contents($configJson, json_encode($cfg, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); - } - $message = 'Thema verwijderd.'; - $messageType = 'success'; - } + if ($auth->verifyCsrf($_POST['csrf_token'] ?? '')) { + $themeName = preg_replace('/[^a-zA-Z0-9_-]/', '', $_POST['theme'] ?? ''); + if ($themeName !== '' && file_exists($themesDir . '/' . $themeName . '/theme.json')) { + $cfg = json_decode(file_get_contents($configJson), true) ?? []; + $cfg['active_theme'] = $themeName; + file_put_contents($configJson, json_encode($cfg, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + adminLog($config, 'info', $user['username'] . ' activeerde thema ' . $themeName); + $message = 'Thema geactiveerd.'; + $messageType = 'success'; } } } @@ -1123,18 +1085,135 @@ function handleTheme(AdminAuth $auth, array $config): void } } - // Load theme being edited - $editThemeName = preg_replace('/[^a-zA-Z0-9_-]/', '', $_GET['edit'] ?? ''); - $editTheme = null; - if ($editThemeName && isset($themes[$editThemeName])) { - $editTheme = $themes[$editThemeName]; - $editTheme['name'] = $editThemeName; - } - $route = 'theme'; require __DIR__ . '/../admin/templates/layout.php'; } +function handleThemeNew(AdminAuth $auth, array $config): void +{ + $user = $auth->getCurrentUser(); + $csrf = $auth->getCsrfToken(); + $themesDir = $config['codepress_root'] . '/themes'; + $message = ''; + $messageType = ''; + + if ($_SERVER['REQUEST_METHOD'] === 'POST') { + if (!$auth->verifyCsrf($_POST['csrf_token'] ?? '')) { + $message = 'Ongeldige CSRF token.'; + $messageType = 'danger'; + } else { + $newName = trim($_POST['theme_name'] ?? ''); + + if (empty($newName)) { + $message = 'Thema naam is verplicht.'; + $messageType = 'danger'; + } elseif (!preg_match('/^[a-zA-Z][a-zA-Z0-9_-]*$/', $newName)) { + $message = 'Ongeldige thema naam. Gebruik alleen letters, cijfers, streepjes en underscores. Begin met een letter.'; + $messageType = 'danger'; + } elseif (file_exists($themesDir . '/' . $newName . '/theme.json')) { + $message = 'Thema met deze naam bestaat al.'; + $messageType = 'danger'; + } else { + $newThemeDir = $themesDir . '/' . $newName; + mkdir($newThemeDir, 0755, true); + + $defaults = [ + 'title' => $newName, + 'config' => [ + 'default_template' => 'full_content', + ], + 'template' => [ + 'full_content' => 'full_content.twig', + 'left_sidebar' => 'left_sidebar.twig', + 'right_sidebar' => 'right_sidebar.twig', + 'custom1' => 'custom1.twig', + ], + ]; + file_put_contents($newThemeDir . '/theme.json', json_encode($defaults, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + + // Scaffold a full theme folder from the default theme + $defaultThemeDir = $themesDir . '/default'; + if (is_dir($defaultThemeDir)) { + $copyDirs = ['partials', 'css', 'js']; + foreach ($copyDirs as $sub) { + $src = $defaultThemeDir . '/' . $sub; + if (is_dir($src)) { + $dst = $newThemeDir . '/' . $sub; + mkdir($dst, 0755, true); + foreach (scandir($src) as $f) { + if ($f[0] === '.') continue; + if (is_file($src . '/' . $f)) { + copy($src . '/' . $f, $dst . '/' . $f); + } + } + } + } + foreach (['base.twig', 'full_content.twig', 'left_sidebar.twig', 'right_sidebar.twig', 'custom1.twig'] as $tpl) { + if (is_file($defaultThemeDir . '/' . $tpl)) { + copy($defaultThemeDir . '/' . $tpl, $newThemeDir . '/' . $tpl); + } + } + // Copy the default theme's preview image if present + if (is_file($defaultThemeDir . '/theme.png')) { + copy($defaultThemeDir . '/theme.png', $newThemeDir . '/theme.png'); + } + } + + adminLog($config, 'info', $user['username'] . ' maakte thema ' . $newName . ' aan'); + header('Location: /admin/theme'); + exit; + } + } + } + + $route = 'theme-new'; + require __DIR__ . '/../admin/templates/layout.php'; +} + +function handleThemeDelete(AdminAuth $auth, array $config): void +{ + if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + header('Location: /admin/theme'); + exit; + } + + $configJson = $config['config_json']; + $themesDir = $config['codepress_root'] . '/themes'; + $themeName = preg_replace('/[^a-zA-Z0-9_-]/', '', $_GET['theme'] ?? ''); + $themeDir = $themesDir . '/' . $themeName; + + if ($themeName === '' || $themeName === 'default' || !is_dir($themeDir)) { + header('Location: /admin/theme'); + exit; + } + + if ($auth->verifyCsrf($_POST['csrf_token'] ?? '')) { + // Recursively remove the entire theme directory + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($themeDir, RecursiveDirectoryIterator::SKIP_DOTS), + RecursiveIteratorIterator::CHILD_FIRST + ); + foreach ($iterator as $file) { + if ($file->isDir()) { + @rmdir($file->getRealPath()); + } else { + @unlink($file->getRealPath()); + } + } + @rmdir($themeDir); + + $cfg = json_decode(file_get_contents($configJson), true) ?? []; + if (($cfg['active_theme'] ?? '') === $themeName) { + $cfg['active_theme'] = 'default'; + file_put_contents($configJson, json_encode($cfg, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); + } + adminLog($config, 'info', ($_SESSION['admin_user'] ?? 'unknown') . ' verwijderde thema ' . $themeName); + } + + header('Location: /admin/theme'); + exit; +} + function handlePlugins(AdminAuth $auth, array $config): void { $user = $auth->getCurrentUser(); @@ -1707,55 +1786,39 @@ function handleLogs(AdminAuth $auth, array $config): void $user = $auth->getCurrentUser(); $csrf = $auth->getCsrfToken(); - $activeTab = $_GET['tab'] ?? 'admin'; - if (!in_array($activeTab, ['admin', 'requests'])) $activeTab = 'admin'; - - $adminLogFile = $config['log_file']; - $requestLogFile = $config['request_log']; + // Filters + $filterEvent = $_GET['event'] ?? ''; + $filterLevel = $_GET['level'] ?? ''; + $filterSearch = trim($_GET['search'] ?? ''); + $limit = max(10, min(1000, (int)($_GET['limit'] ?? 200))); // Clear if (isset($_GET['clear'])) { - $target = $activeTab === 'admin' ? $adminLogFile : $requestLogFile; - @file_put_contents($target, ''); - $message = $activeTab === 'admin' ? 'Activiteiten log gewist.' : 'Requestlog gewist.'; - header('Location: /admin/logs?tab=' . $activeTab); + LogManager::clear(); + $message = 'Log gewist.'; + header('Location: /admin/logs'); exit; } // Download if (isset($_GET['download'])) { - $target = $activeTab === 'admin' ? $adminLogFile : $requestLogFile; - $filename = $activeTab === 'admin' ? 'admin.log' : 'requests.log'; - if (file_exists($target)) { - header('Content-Type: text/plain'); - header('Content-Disposition: attachment; filename="' . $filename . '"'); - header('Content-Length: ' . filesize($target)); - readfile($target); + $entries = LogManager::getLogs(1000, $filterEvent ?: null, $filterLevel ?: null, $filterSearch ?: null); + $out = ''; + foreach ($entries as $e) { + $out .= '[' . $e['time'] . '] [' . $e['event'] . '] [' . $e['level'] . '] [' . $e['ip'] . '] ' . $e['message'] . "\n"; } + header('Content-Type: text/plain'); + header('Content-Disposition: attachment; filename="codepress.log"'); + echo $out; exit; } - // Read admin log - $adminLogs = []; - if (file_exists($adminLogFile)) { - $lines = file($adminLogFile); - $lines = array_slice($lines, -200); - foreach ($lines as $line) { - if (preg_match('/^\[([^\]]+)\] \[([^\]]+)\] \[([^\]]+)\] (.+)$/', trim($line), $m)) { - $adminLogs[] = [ - 'time' => $m[1], - 'level' => strtolower($m[2]), - 'ip' => $m[3], - 'message' => $m[4], - ]; - } - } - $adminLogs = array_reverse($adminLogs); - } + // Read log entries with filters + $logEntries = LogManager::getLogs($limit, $filterEvent ?: null, $filterLevel ?: null, $filterSearch ?: null); - // Read request log - $requestLogger = new RequestLogger($requestLogFile); - $requestLogs = $requestLogger->getLogs(200); + // Available event types for the filter dropdown + $eventTypes = ['admin', 'requests', 'errors', 'security', 'content', 'system']; + $levelTypes = ['info', 'warning', 'error', 'debug']; $route = 'logs'; require __DIR__ . '/../admin/templates/layout.php'; @@ -1826,6 +1889,22 @@ function handleUpdate(AdminAuth $auth, array $config): void // --- Frontmatter helpers --- +/** + * Remove the URL scheme (http://, https://) from a website value so it is + * stored as a bare hostname. The engine adds the scheme back when rendering. + * + * @param string $url Raw URL value + * @return string Hostname without scheme + */ +function stripUrlScheme(string $url): string +{ + $url = trim($url); + if (preg_match('#^[a-zA-Z][a-zA-Z0-9+.\-]*://#', $url)) { + $url = preg_replace('#^[a-zA-Z][a-zA-Z0-9+.\-]*://#', '', $url); + } + return rtrim($url, '/'); +} + /** * Keep a timestamped copy of a content file before it is overwritten. * @@ -1840,6 +1919,7 @@ function backupContentFile(string $filePath, int $keep = 5): void $contentRoot = realpath(dirname(__DIR__) . '/content'); $realFile = realpath($filePath); + if (!$contentRoot || !$realFile || strpos($realFile, $contentRoot) !== 0) { return; } diff --git a/public/index.php b/public/index.php index 562e3f3..1b5f543 100644 --- a/public/index.php +++ b/public/index.php @@ -4,6 +4,9 @@ require_once __DIR__ . '/../cms/core/index.php'; $config = include __DIR__ . '/../cms/core/config.php'; +// Initialize dynamic logging +LogManager::init($config['logging'] ?? []); + // Security headers header('X-Content-Type-Options: nosniff'); header('X-Frame-Options: SAMEORIGIN'); @@ -114,8 +117,8 @@ $secSettings = $config['security'] ?? [ $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? ''; $analyticsSettings = $config['analytics'] ?? []; $excludedIps = $analyticsSettings['excluded_ips'] ?? []; -$isAllowedIp = in_array($clientIp, $secSettings['allowed_ips'] ?? [], true) - || in_array($clientIp, $excludedIps, true); +$isAllowedIp = RequestLogger::ipMatchesList($clientIp, $secSettings['allowed_ips'] ?? []) + || RequestLogger::ipMatchesList($clientIp, $excludedIps); $requestStatus = 'ok'; if (!$isAllowedIp) { @@ -184,6 +187,15 @@ if (!str_starts_with($path, '/-media/') && !str_starts_with($path, '/-assets/')) $geoCountry ); + // Also record through the dynamic log manager (requests event) + LogManager::log(LogManager::EVENT_REQUESTS, 'info', 'Request: ' . $currentPage, [ + 'ip' => $storedIp, + 'page' => $currentPage, + 'status' => $requestStatus, + 'country' => $geoCountry, + 'user' => $loggedInUser, + ]); + // Record aggregated statistics if (!empty($analyticsSettings['enabled']) && !in_array($clientIp, $excludedIps, true)) { $analytics = new Analytics($analyticsSettings); diff --git a/public/themes/test_bg.jpg b/public/themes/test_bg.jpg deleted file mode 100644 index 5e049ad4d0a3dd0e9884fa9a2ed453d14072947a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360343 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

@(v~R+~iU0uPs! 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ΜD;p4OI{Z;P9?fv>Z5TU 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⪚(wkF8P} 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

    *&uxTRnBxEA4-Twe{nyRRalj?rWaZmoC_IBE0 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 + + + + + {{ page_title }} - {{ site_title }} + + + + + + + + + + + + + + + {% if block_ai_bots %} + + + {% endif %} + {% if block_search_engines %} + + {% endif %} + + + + + + + + + + + + + + + + {% if theme_css_url %} + + {% endif %} + + + + + + + + + {% include 'partials/header.twig' %} + + + + + +
    + {% block content %}{% endblock %} +
    + +
    + {% include 'partials/footer.twig' %} +
    + + + + {% if theme_js_url %} + + {% endif %} + + diff --git a/themes/default/css/theme.scss b/themes/default/css/theme.scss new file mode 100644 index 0000000..62a1fb0 --- /dev/null +++ b/themes/default/css/theme.scss @@ -0,0 +1,367 @@ +// CodePress default theme styles +// Compiled at runtime by ThemeManager (scssphp) into public/themes/default/theme.css + +// Theme color variables (defined per theme; used by the CSS custom properties below) +$header-bg: #0a369d; +$header-font: #ffffff; +$header-height: 56px; +$nav-bg: #2754b4; +$nav-font: #ffffff; +$nav-height: 42px; +$sidebar-bg: #f8f9fa; +$sidebar-border: #dee2e6; + +// Optional header background image and overlay opacity +$header-bg-image: none; +$header-bg-opacity: 1; + +:root { + --header-bg: #{$header-bg}; + --header-font: #{$header-font}; + --header-height: #{$header-height}; + --nav-bg: #{$nav-bg}; + --nav-font: #{$nav-font}; + --nav-height: #{$nav-height}; + --sidebar-bg: #{$sidebar-bg}; + --sidebar-border: #{$sidebar-border}; +} + +// Header background (optional background image via $header-bg-image) +#site-header { + background-image: $header-bg-image; + background-size: cover; + background-position: center; + background-repeat: no-repeat; + position: relative; +} + +@if $header-bg-image != 'none' { + #site-header::before { + content: ''; + position: absolute; + inset: 0; + background-color: var(--header-bg); + opacity: $header-bg-opacity; + pointer-events: none; + z-index: 0; + } +} + +// Header styles +.navbar { + background-color: var(--header-bg) !important; + min-height: var(--header-height); + + .navbar-brand, + .navbar-text, + .form-control, + .btn { + color: var(--header-font) !important; + } + + .form-control::placeholder { + color: rgba(255, 255, 255, 0.7) !important; + } + + .btn-outline-light { + border-color: var(--header-font) !important; + } +} + +// Language dropdown styling +.dropdown-menu { + background-color: var(--header-bg) !important; + border: 1px solid var(--header-font) !important; +} + +.dropdown-item { + color: var(--header-font) !important; + + &:hover { + background-color: rgba(255, 255, 255, 0.1) !important; + color: var(--header-font) !important; + } +} + +// Hide Bootstrap dropdown arrow and use custom icon +.dropdown-toggle::after { + display: none !important; +} + +.btn-outline-light { + color: var(--header-font) !important; + border-color: var(--header-font) !important; + + &:hover { + background-color: rgba(255, 255, 255, 0.1) !important; + color: var(--header-font) !important; + } + + &:focus, + &:active, + .show > &.dropdown-toggle { + background-color: rgba(255, 255, 255, 0.1) !important; + color: var(--header-font) !important; + border-color: var(--header-font) !important; + box-shadow: none !important; + } +} + +.bi-chevron-down { + font-size: 0.75em; + margin-left: 0.25rem; +} + +// Remove Bootstrap default breadcrumb separators +.breadcrumb-item + .breadcrumb-item::before { + content: "" !important; + padding: 0 !important; +} + +// Custom breadcrumb styling +.breadcrumb { + --bs-breadcrumb-divider: ""; + + .breadcrumb-item { + color: var(--nav-font) !important; + + a { + color: var(--nav-font) !important; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } + } +} + +// Sidebar toggle button in breadcrumb +.sidebar-toggle-item { + display: flex; + align-items: center; + margin-right: 0.5rem; +} + +.sidebar-toggle-btn { + padding: 0; + line-height: 1; + font-size: 1.1rem; + color: var(--header-bg) !important; + border: none !important; + background: transparent !important; + box-shadow: none !important; + cursor: pointer; + + &:hover { + opacity: 0.7; + } +} + +// Sidebar hide/show transition +.sidebar-column { + transition: all 0.3s ease; +} + +.sidebar-hidden { + display: none !important; +} + +// Navigation section background +.navigation-section { + background-color: var(--nav-bg) !important; + color: var(--nav-font) !important; + min-height: var(--nav-height); +} + +// Enhanced accessibility styles +.focus-visible:focus, +.btn:focus, +.form-control:focus, +.nav-link:focus { + outline: 3px solid #0056b3 !important; + outline-offset: 2px !important; + box-shadow: 0 0 0 1px #ffffff, 0 0 0 4px #0056b3 !important; +} + +// High contrast mode support +@media (prefers-contrast: high) { + :root { + --text-color: #000000; + --bg-color: #ffffff; + --border-color: #000000; + --focus-color: #000000; + } + + .btn-primary { + background-color: #000000 !important; + border-color: #000000 !important; + color: #ffffff !important; + } + + .btn-outline-light { + color: #000000 !important; + border-color: #000000 !important; + } + + .text-muted { + color: #000000 !important; + } + + .navbar { + background-color: #ffffff !important; + border-bottom: 1px solid #000000 !important; + } +} + +// Reduced motion support +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} + +// Remove nav-tabs background so it inherits from parent +.nav-tabs { + background-color: transparent !important; + border: none !important; + + .nav-link { + background-color: transparent !important; + border: none !important; + color: var(--nav-font) !important; + + &:hover { + background-color: rgba(255, 255, 255, 0.1) !important; + } + + &.active { + background-color: rgba(255, 255, 255, 0.2) !important; + border-bottom: 2px solid var(--nav-font) !important; + } + } +} + +// Sidebar styling +.sidebar-column { + background-color: var(--sidebar-bg) !important; + border-right: 1px solid var(--sidebar-border) !important; + position: sticky; + top: 0; + min-height: calc(100vh - var(--header-height) - var(--nav-height) - 42px); +} + +.sidebar { + padding: 1.5rem; + height: 100%; + overflow-y: auto; +} + +.content-column { + background-color: #ffffff; +} + +.content-wrapper { + padding: 2rem; + padding-bottom: 80px !important; +} + +// Ensure full height layout +.main-content { + flex: 1; +} + +// Mobile responsive +@media (max-width: 767.98px) { + .sidebar-column { + border-right: none !important; + border-top: 1px solid var(--sidebar-border) !important; + min-height: auto; + margin-top: 1rem; + } + + .content-column { + background-color: #ffffff; + } + + .content-wrapper { + min-height: auto; + padding-bottom: 2rem !important; + } +} + +// Tablet and mobile: sidebar below content +@media (max-width: 991.98px) { + .sidebar-column { + order: 2 !important; + } + + .content-column { + order: 1 !important; + } +} + +// Code block styling +pre { + background: #f8f9fa; + padding: 1rem; + border-radius: 6px; + overflow-x: auto; + border: 1px solid #dee2e6; + margin-bottom: 1rem; + + code { + background: none; + padding: 0; + color: #333; + font-size: 0.85rem; + line-height: 1.5; + } +} + +code { + background: #e8e8e8; + padding: 0.15rem 0.4rem; + border-radius: 3px; + font-size: 0.9em; + color: #d63384; +} + +// Footer icon hover effects +.footer-icon { + color: #6c757d; + text-decoration: none; + transition: all 0.2s ease-in-out; + display: inline-block; + padding: 2px; + + &:hover { + color: #0d6efd; + transform: translateY(-1px); + } + + &:active { + transform: translateY(0); + } + + &.guide:hover { + color: #198754; + } + + &.cms:hover { + color: #dc3545; + } + + &.git:hover { + color: #6f42c1; + } + + &.website:hover { + color: #fd7e14; + } +} diff --git a/themes/default/custom1.twig b/themes/default/custom1.twig new file mode 100644 index 0000000..4588091 --- /dev/null +++ b/themes/default/custom1.twig @@ -0,0 +1,18 @@ +{% extends 'base.twig' %} + +{% block content %} +
    +
    + +
    +
    + {{ content|raw }} +
    +
    +
    +
    +{% endblock %} diff --git a/themes/default/full_content.twig b/themes/default/full_content.twig new file mode 100644 index 0000000..05f4748 --- /dev/null +++ b/themes/default/full_content.twig @@ -0,0 +1,11 @@ +{% extends 'base.twig' %} + +{% block content %} +
    +
    +
    + {{ content|raw }} +
    +
    +
    +{% endblock %} diff --git a/themes/default/js/theme.js b/themes/default/js/theme.js new file mode 100644 index 0000000..816a279 --- /dev/null +++ b/themes/default/js/theme.js @@ -0,0 +1,21 @@ +// CodePress default theme JavaScript +// Loaded after the global app.js on every page. + +(function () { + 'use strict'; + + // Sidebar toggle (used by the breadcrumb toggle button) + function toggleSidebar() { + var sidebar = document.getElementById('site-sidebar'); + if (!sidebar) return; + sidebar.classList.toggle('sidebar-hidden'); + var btn = document.querySelector('.sidebar-toggle-btn'); + if (btn) { + var hidden = sidebar.classList.contains('sidebar-hidden'); + btn.setAttribute('aria-expanded', hidden ? 'false' : 'true'); + } + } + + // Expose for inline onclick handlers + window.toggleSidebar = toggleSidebar; +})(); diff --git a/themes/default/left_sidebar.twig b/themes/default/left_sidebar.twig new file mode 100644 index 0000000..89e3197 --- /dev/null +++ b/themes/default/left_sidebar.twig @@ -0,0 +1,26 @@ +{% extends 'base.twig' %} + +{% block content %} +{% if sidebar_content %} +
    + +
    +
    + {{ content|raw }} +
    +
    +
    +{% else %} +
    +
    +
    + {{ content|raw }} +
    +
    +
    +{% endif %} +{% endblock %} diff --git a/cms/templates/assets/footer.mustache b/themes/default/partials/footer.twig similarity index 61% rename from cms/templates/assets/footer.mustache rename to themes/default/partials/footer.twig index b9ffc14..78cd213 100644 --- a/cms/templates/assets/footer.mustache +++ b/themes/default/partials/footer.twig @@ -5,38 +5,38 @@
    - - {{page_title}} - {{#file_info_block}} + + {{ page_title }} + {% if file_info_block %} - {{#show_created}} - - {{created}} - {{/show_created}} - - {{modified}} + {% if show_created %} + + {{ created }} + {% endif %} + + {{ modified }} - {{/file_info_block}} + {% endif %}
    - + | - {{#cms_version}} - {{cms_version}} - {{/cms_version}} - + {% if cms_version %} + {{ cms_version }} + {% endif %} + | - + | - + @@ -45,4 +45,4 @@
- \ No newline at end of file + diff --git a/cms/templates/assets/header.mustache b/themes/default/partials/header.twig similarity index 63% rename from cms/templates/assets/header.mustache rename to themes/default/partials/header.twig index 6413fc4..a71f4da 100644 --- a/cms/templates/assets/header.mustache +++ b/themes/default/partials/header.twig @@ -1,75 +1,75 @@ \ No newline at end of file + diff --git a/cms/templates/assets/navigation.mustache b/themes/default/partials/navigation.twig similarity index 69% rename from cms/templates/assets/navigation.mustache rename to themes/default/partials/navigation.twig index 0b1495a..32e76e1 100644 --- a/cms/templates/assets/navigation.mustache +++ b/themes/default/partials/navigation.twig @@ -5,13 +5,13 @@
- \ No newline at end of file + diff --git a/themes/default/right_sidebar.twig b/themes/default/right_sidebar.twig new file mode 100644 index 0000000..630bcf1 --- /dev/null +++ b/themes/default/right_sidebar.twig @@ -0,0 +1,26 @@ +{% extends 'base.twig' %} + +{% block content %} +{% if sidebar_content %} +
+
+
+ {{ content|raw }} +
+
+ +
+{% else %} +
+
+
+ {{ content|raw }} +
+
+
+{% endif %} +{% endblock %} diff --git a/themes/default/theme.json b/themes/default/theme.json index e9cc83d..da748dd 100644 --- a/themes/default/theme.json +++ b/themes/default/theme.json @@ -1,13 +1,12 @@ { - "name": "Standaard", - "header_color": "#0a369d", - "header_font_color": "#ffffff", - "header_height": "56", - "navigation_color": "#2754b4", - "navigation_font_color": "#ffffff", - "nav_height": "42", - "sidebar_background": "#f8f9fa", - "sidebar_border": "#dee2e6", - "background_image": "", - "background_image_opacity": "100" + "title": "default", + "config": { + "default_template": "full_content" + }, + "template": { + "full_content": "full_content.twig", + "left_sidebar": "left_sidebar.twig", + "right_sidebar": "right_sidebar.twig", + "custom1": "custom1.twig" + } } diff --git a/themes/default/theme.png b/themes/default/theme.png new file mode 100644 index 0000000000000000000000000000000000000000..35ff861d82aed4f0e1194cd842f0549b6436d3f6 GIT binary patch literal 21857 zcmd422T)U87&eF%D|~k8B2Bt<=_;QH33V>|qUjqOmvKgU^nJRQ$IW&K=p)CU@|u?35=vAuZB#}~+x#Oo zHnk6IY*(IVH9XW{{p0u(L%o0Z4sgx%h((Y87nQ;YgD*6&{-NQrY9whcqInnC7cYWZ% zS!VFA4udOqO>1^+InZ~L%YuWWsY&6fu-IwVy|M6uY?beS=e>cDVIKlSc z-U~u(NB{1;AH(*~->sW+hj0Jg`u4*eh=yKm#8cBf*6}AeQKH>dM)~41rR6nZ4uUq(h7aE+0ex1$UCsq$@Ax3+^$N zM-nj-rR{CQlQx3K1T&T>#L=d(PKpjRdt~u}EZ8YO9Ts=-K1Jg14eo~Qt{s|y-ovc$ z-Ho6_qnxXW<;+{!Yx#{97fj-T`f-@ zJViqA2{uqN!-BBcH(3ckw+Ce=+P@@1N>U?tw;b1W(C|46xzdyTKsb{a<0U4{m$q*1 zYRP#}^u?aU;coR6dP>o5;qvVJAc#TJh1QGD6TI7;P{~bozB?ArkaJhTcix>1=_RD;hTdBH z)AuTAWT$H3DK^zPzNHM;u4?0SW4+#NVRBX7`*PAMB>(8l2ha zxusFbzQu}@NJPY8H-pUJ#RXqVgcza!iDPyIe*~Os`nZ@`eUdlyU2f(v z>7EbQfZr)RV75iQ9TW>nH%0Lr5*ZO?@y`1h4StIRmrO1_tfT2qo{WCd#e z^zh?sOC)5vxdaRFd)hKc?;8SS zxWJNVOu7knx zTHmnzp_PRCT%| zkovaz&z~6{n6jaaA76aFtt>jZt?XeFIH@L|<}FEe!Q{Bf%>wCH5XYE$VdiUY;*$yM zGGKKcX1u3{sh|dGee&HKArrJDk;_+BYFDfP@T4arh+$~7)R-;~>SHh3vWZO#f4($Y z^W+%$ZNSIb5?Q#;p?vJ?d-~cQR^AGaUQ{cGM$uA5aL8U_QfIfZb^KmHh}6t%<>1SW{wY>WPXbg2g=lpn;YL!ab)KKv#;HG&a^GtXh&Vp%-XkLIMPqQx zdsgpJ(4G=&AA9?chV76{Aby)wT-;|!*<-c zlQ8-ANrBOe%>oCNw~?FRdg!BbFXnoxX0R$oT6}wt3R=JrH&;i2b2+1?OS1++yRsex zUTp#}W1^2?)*7rE-iN z`R~8LHBSX!!gdvy=E=IZ1BgYnm9jY9;G%o2Y4z8IvFSm*F1^==(*U;k;M8^fPAdj= z#0Tk5GltInj+*@+S!|h<-XJr!Yqhv|~Zy1qv0fZ-{1 zUh;)x%TCc*VWvx6sp&$u`Qm3dhJI^1Up@d^_pSCVJl9H5Rn#jpCY=Y5SEYxqr}6-Eg>)nW!&FiPk7GVxbkF5GE$sqo%M%+r zb~zIOMDJmCo}^DK2FMutS%htGHWXu_+JHAnjmdl>!|1Wuf$irM?@bl`&Dwg-pH@QC zyWtGz4V3Ji3{CgeR|-)vpSrnpRR;iWLd3;}pyvy-Cr%2aPf{xuVI$KuWX7_NpJT|@ zNqPjXH_dy>d)QIi1gE6g-W~H_H!&{;-Q|%L9#{Dk%<9Y=Sw5yMMfqbOLYa5ql2VeP zUwb-v47db^(ns%Uge%NchghIi`D&y}SN5hff2T=)!K4TwyBwlGh%Sg7D42oF-|JpV z73uiY28tYL`gfC#BK`cplv7_c*HwTEm`L&ZZP^QLRDJFLn50)KiiM(ot_19Y)S=UE zll?aqs#8WomcXWU&)zzP^)wLIq&inkTCW)0&z;KhMzxfY@4EM*o7Dc^`EChNnyvbS zs*g4CTaY-?Wj=HF?noF;X0Lvl`zcH}ccG%d4z5@=lt46h16&YW_bL6bv{|O&(UO$V ze}unuNu8F+$EX4E!JWTgOl*s?Sh;fcvhou)R~fodDG%Sr*kBFj*G!ojt;U#bCN#qh zpmJm>)u0|d@(OopY)ij|qD@?I6Y|5X?(SZ-dn#O3Caicy!pyGn%muC5E%)~2GGSzoHB!|#%-f_H zQ`s#&)Oeo?QKrLYb`-y(bze*kiBDdsos4O{y;X>gHpB%2G6leowim**FnBxA{Pu%_ zD96m}_xcS~g(^MnYc~(=dEPGZ+{^?}3oVe_@mWY^EXS;*CZeGbZfBme6D+9L!a0tW z?4h6<=7*mZlyLuCOWa9owdMXg5>cab-OmUQZ;3h*j>emL8&XF`J{6_(^s9C>wN-%_ z_oQov>sIc93*sb#G#V^o_WND2B_OvjHI(1o0LUX=`YeYkhQ|ua}R@O5MPePUXyhFfeu}1YNJ7NP9mEy z0JVmd`)`&P|6>cuHe2i9YB_zIIrQ(SwbKr}Ywx(dR6to}W=c$UXtA0|&rYacYSjg} z8$j?-p9rGPmGf|kkF;!*o)YYMS!N||!n?o^2ZMNOE&n0xRO5d>MkxcnkT&ZXeb32- zlRX)X1}(&ULi(@Q^xQA_Ge*`|HJloNMjS#Wjpb=t9`h7=-S_{ zM^BEv_`CJu-MRnA4#eK@VVpVb9tIC#(3d<&4&Dc&{f(NU|L$aW93#pmMX~v*y&w+$ z9Vr(F8B8th-VHM>iU9_uQb5%uVtk&+o6vrB+yhdnm;uVbdR{F@A1PB)6dt5i;UYO+~Dv#BKNdGX>uWFj=J6!e014X-4WplkVb9YPgTQvX7q&2^^aCHKx#;Z z5h*iv8FvT2m@=3CR`7DeFnsWhbn^h`+Ll!5O_K~JZT^c(z9E{3>8hLc0pK|J5`^)| zaD@i=+Z7y}5iT5HG0xcwLwA0yO(}pxo~~uWf75f9R*Zzu_(og^E460&fKOS+rqwd} z-2J|MT7T0%#2q3JP$?agxI*mwD(0q|FGD{9fA^(H!*a#3U^OnurAj5mvm|!;U6>)a z1Gp`+g)?}}Zx_Yf`snuMX4%y*dby~YqJXUk;Dc1RvrA`^ni`aUe{1r<&B!nfj#2}? z)!*^I%TEdhyfZLMg2#@i@7N?&GrPWM6N`mYV`Qhue{O&=(FVHl9e{JEPi0G8$9q~n zwkxdwrUl54j(Q}hIbXH$WkPTTO?O&7smYO-$ZA!-paSDH18JXo`sB3X=?bzKMJjM; zPgkHoucpt^pWTqq^1b0+`&B>MP=DU@zD(e3C)G~ks+9A5rr=NiGG7c}5%KyQ4(pf( zy47#ay|pm#lsyDMPSbkEVA9Z#6sjy9{Gda~(zL@LGSUO)1|XsDSXtV7Yju!wkU3(| z^+j2w{wmCdWbpSbtpRGZd>tHD!*e#jrZ7X}SenrQ6I!iC9G-L0)*jZXzrT8BaxGqf zqr528q!S}OTNtAQue2Y}tSGLT@+t4=X$^{*gsRKA-s{=cWdqAq4gIob<*Sp&_>V%4 z$q%}rJ{FlNg)n0!O$@2naFqT_QjVPolO8)5gchUi6oifc$wzR6>=RA#>5a;nRuJ7V zf?zZr{HR`W@5j$eN^6EejDr+BOeOdLb4a`>LlN|;;D%cU`RqqM;%_Ca)-{Buw)m7K za-Usv2yKZ1KHLj9F4H7I=?E|G>*>VF%8|lt!z!nME#RkWDg~htg8<2<#8XaR37+AW zWE*e&Z|EePY()#EM6NZ^xK%PR77MhTN7oU*KIsKg?CpC?JZ?;1wP^8M(qo-E@5mKU zs)fMV;2usTUIP~O@>z5ECM7HHDz(Mip+{Z70kredca{0^Gt$F!Vf63t^T?s#GFyWg z^q{WU`lj@RiYCV9O%DbShnvhSF|YY&t6L?(;A6!y|I<$B@Tfrih$- zZFFLl)oRTOIK?l+Y_4isk8e^Kxo$lQr%K>AdKqF!Yal3$4ujq}( z+Y6t~Ts9s06m3#EImz48e`VK>dps<1A<-W9pNo)`os43smGIn36b^5SoAGB(mW2Rf zJ>1rN2qMnv5ci+M+WqF_@1=gpBp%oG#Zk1kXGSE*por6h=lP~B82DrRuGo9H26UBn zjA0xmd+)Evs34xdHn?57XvVMxB0XDL0@}3ZeqS}!i!QlzRR#^kA)-7lih+3E>+4XzRG(#(t?(g09bl=@rQT^Ikb3EX<;RqshRjD?L_pElH zcG*RuT%N;sW$}FbT3H3(MBd{5pmyHSn^Vg5FyHB|*rtHfd5y*oC`B!wy$#fgkH;4Y zQ2`7)t{p_Uo7zQj2feN0O(rrl1EJB|te)*M@(x#j9@Zk{mOlpV6Wiz{svuNG{W7Y9 zqb`CJ1;c=s$@JB)9$xAEi1 zT?kRPXWrhLABmV)!Ooufn_ytq@rS>Cla+~kFC}W923fk#IZiu@Odc7wOD?6?1#K^#Bl`mfe%IXx zX83?zZHTa}(WkXYl;iq#)z6u977?Fm;hZ%c^igf6H3jg&A1*+b!hGu$F*6OoSp$u{ z*&N5e~+XQ4#>^HwYQ36yZz`UMQKvzSpKwKvsg}0mhxy>+Xn&kWW5KM!~-vDGjjo*1TFqG+tr8`V=z5sm5??yPKID z9jLJxE(!uYr%o|&FFdpD3>H%iP?uM+!JW5Al~;9JBSd(sq5u#nthu^r34zggv6+%6%`=kvfZh&!^E-ufpY&?am%!h>koy6y($=6VPnT)wduJQ2 zT-G*^=Jk>Vg<6X@3#~YLml1ZP|LTUD7_)^#&wlR_Jx7bCMYIXVJA|yHt?j|)`i;Zj z$yjjLf(MK@FOMg6Cd*f~J=P`wlVSnxitd8w^I(F@B}#<_0Q0LY1a*JkWZk(c)uwFt z4r$vT<8`Hj#ba6rzaS{>oIwtpFq`0Y&uY1<6!%{y+&MzgYX&we>6hx? zzIz@&*LZPU^|RHYKNx_}UOLK`no&@@sy(BXCktv&oA`W@;j#T0?u`2vDT}q-w(De; z*pA2S0`F(n&A$tR3%MOZk!(b16#|5CNVzb$CBiQh6mMZ12J@&)-4dXr)HpeSeGpt- z^Qp;|)d9tsp6H9UoAf^)PJq|2%*lu&h}Koh2jb#8>%K)Eg$AU?J#eYKD$9ka$Ff`q zkvPL(mCd?~DSNK8ucE;BGQMu!HwzNJ6Os-Y{;~@5;w>Ata z@PASj@2drp%}O6Y$^8~Wk(5Fqa3S|sZ&#?~UxT~5rL(!25YQGgH8mjfpB4YD3+Afx z;y;JJG5F| zX|1AEQEbLQ>2a*v_@6SWS>3funbY;1U?*40wZ)OWk!vBluDG||xy6zeA~i(^bv*%% zFmk<8-axOTndcj56KyT%V}ao5I1gijF+!tssUzBa>^$7_WlyLE!_Y6oH@6WH>S`H( zB{f8sZa{W1L?6e1`k1E+Lha54z%+q2Dm?59_PBSNv&q-PQ=7VOK|qfJ$dBy4tuLz; z*emHWcGth0&()`mT9%Uin}_%Xvi`}oyK~CmgnyImU2cWIrP6*!I0Y4VhLe~wVt!=5 zK9(`D{4WAaD*1Z7MTwcXSGA;pqF;Kavd^FUhv&Ld_u9QhdIykp&pr~e?XV^E6#6n# zKwp8I^QtM`r68pwKyTKsz<#ISI=;r(&5!lefwb`6#)hpoGr-?o((VL@#7_F|$60DE z?znJ1Kdee?Een^9dJu!obw^_|BUmnm4}Y=%qm(+>OOPkgA88A3oog z;SYrI8)2kw>Qt&Z)(jOoxN5grmURt?Mx9bje09D|l_V{5wnQbY^`ste3c5=j;UH~Gx=}a$tQ~iu2Pd=+2zSu_3ar-wR>eYOIDMUK`0oQD3sWa@-+fuSFK^L(hB1)Rgw_VX|1$M&8}bM$5Gm@*1l1S9y69AVHAvG)F40F=^i*sbk%!on4Q`cQ6%l$ z29K{iu93K(@;yBCmt)EIO%DED1fo86u(u)5j61NlW$b$quvR_qVF2vU0%9o5EAgE) zTqPToMyj@U9VsrqioFEl45Zk!*||a7eaIjK&_VJ-GNbwpji^qYO8Ks-Qk$0mg-Q+G^p0s9|V5( zlI&qT2;07^U0R*~&`ra4+^Ko?ZWLjq99s|n-pjy^(TA;*k@}XE#O_Oc zJL_xGhjw4vp|?_cCBk4Ugq=e~g!i#gf#qDm5)dYYL0iC?2!e7}cI*sPe)MYh*iUX# zaiQZS|LTx`vb)UdttWOWZ(S>cI+90?tF}!jN!-Lz3$fY3f$+Z)5*}xkd*s)XWj%pj zS$USue9t+5xhdNlIufF6SR7y=c#823?CLIiQ_IpUG8I_LH{293ClpK7#JGGcxtJ^X z$rI;6o@00MMa5TN_jPM``vQ+ll?d>a73PzEp4amQHoQ)Gc~?*gaiqos-&g|#9tR*1 z_}G9t2V2?H<<;Va6w{3Cke*+s4Fz({?$|g4FKoG)BeWp3Tn}$#I@z}bf5KY==|Y^r zXVT&&fh6ZoW(}sJi9B}^AMR8bbYCM{7M~aC@wTV6z8S~aLQ*jw9KTk(&d_5CK&Er! zUE@J6=FoV;_q?&Cb3B58`GPDHEiKrcKCTlmwQ z;dkF{iaL3UWpB;jUHjR|d4w1Uo>gyei|k3eK07AOi@Yx}Y5CPKEf?O6#<>_}T4bbz z^!=)07Y6hdUbE*8(j3(UoLXs5PLO#k6D*k*3;rq}Y@!fh2 z<R;{RtKzG z6*&El(rkz>+W5k3;qSf2u#}55>k0w)id z$7Lsa4U52JjJ1b{0b6$eFAB0bp8za6KlM_6iM4sec>^1XB=xN7|rv z9s!*THo?`D%;)m$B_<+(y)psYpLwHi9G@B#%95YDYU2qIi*)m388}RLJiTgq;I6pQ ztfFLbw85LvDM(rnT9Fovx!#lmT%Ni~U><{qT`-9p^A7P2DOJsm9Fk6a74@dH4z%9U zZa>O{Ti6W%)`s+=`dbZdfE8bDa-I50}U~Y9+7ocMC=h z7VPXV2w`IjMDHpcdNeQ>LTYU{R0$YcjoD<))4WX%kZqTSUA!TnxvIS(XxYNvs+efk za4UF}l8SQ(ERS{%eSX&$cx!FN)a>o{ zrY0ApOD@h^*s7(`7R$~(#G!2&B$FG@7D4@iQEtn}!S0{1g(>BUmzB31+o!#O;XI7x zGeU4962Da7nh_vkN(?~AByFwky5P<-mSr8I^;!I}ifk^an9>RyKnSYT%mQiG_@v3S8Y3w1jX*dq|{u+W+bpw#D&Y3Lo?G zED<4>d`$baSg9rSHfeVA=-o1idz zOQE}TT|xp!_KCm+`o9I30A|A*9|NvhwJCjOfn31jaa~nWge+sKex`e-ecmvlx783* z+-0ur=mMT-sppbzj&pvy%$`V7nFU=#FFdFMEd9pKHDeafTurV-N30y`_ar1H&5QI9 z^l%@Q1e95fqC9#zmNSMw3(7AL5WGcE<2>>wy3G!nraCR9IV|ZchD+DOD#HdgBYNP1(`q|23V;zlWyjZ`6yKr%vz0m%c$s#F`RbHBS$|l8 z%aaroMx*I(hkyTl30US@QWgS98*GDuKF$Xu>FA+WSv&?NNnE^4)Xxa@T;XvsM9}*~ zX{DSe)O|@hu6=V|cy$u2>FQX+lV(}C`GvM{8|N1(gFQ1}Yf5~#ahvB7KLOiINW5b% zk`$`HYiCKjRO#b%ABfTK?9o@41T_w~I(5wZfdU*7v;>g>s1@*=G}F|2lfBRQh=ZZML!MkVAeE-?8@yeJ z*mk-Ay8c#8(ZTT(v@I;>p|BU8NkN!L(ip0Tn_RRn9UGnhlgVV76Usz4|fAA3hublDQ-s>Uz3e=MT zK(>0o(pY_!Z!`53>6o_T9s&VNbFgt;#E`ba7nmicsQCfLuuE~el{fd2`-3HAPl*Y-wBfiHH8L=uYK=6tstvdJK9^D?V&z81UW$N2!7YcM-p42fvhwO zx7f6vb^$nkY1563O&SlOq8Z~MvNc5^{s7aYJYgfbZ~^SPM*rG<>_F-MnpNz3Rs&kT z+lUN?(8eWN4*1;x_6GG z)QC%>y_m71kTGKls#P0bYLD`#i~v;Ur@z9!UO2h!BXh)@H6=O$jb(WjY-}44Z}faHo>n+D zw~rgglux+-Gjw}(c^^09PM_IF%BgY5z_JNV@nW!5e|aA85%ycoOHBk&0s%A#3f+CW znK=y+9j-=#A^qb+7%;1=WGVwPZQVU9>fc<{x*q!P#)*#Uq%IMdA+Tp$DTJ^nZ4Lm5 zgr%;_Qp2U2d#h#o8}2V$C-QrR{Ggn}<%?-+Zju4wI+16%}F@69)}S8`yzvTB&Q z?dy|Tb_;cbUL`{KfFh~|$wvKitLdN{SHtKtt1pjZBLUO#Fl~q3z|P4w4<4k) zn6fyeztLz-Ih8v~nZtv3Ykjs)s9f(+{O!rLA(SIE4lP+wrB+mx;_;~V9b!}i z=MFnbmem6qZPr=q0=9)54xsy-VR`7~ek2jB$|@WjMX)zm@l{L!a`HGD-N=d<%7RZB z7OjO`Z%08Jne8YX>NhnK!y|K+Pu}r=Z(tt`RU@zR?-jVc?MLzLK0F6Eb|=FgVBwuvr-ImsZUmSD~?V!ZC~D$UbPk8@!o>< zW3tkEpK4^TxVORRwBV;}g*`>eWf>QJ1?TSmIwtgN;oL8wk9seBOBwa!v%!Y5*}dx7 z0m0tt{TwFh8kBNha)}|tKG<-6pujZWI2(RvnB7?*#a_b2v^Os+R?+Lvk9QZu3<#DW zP*_;alSKwH=`Flg<5Ohdt4bcULBdQ!Mha= z>^L!!i6-2Hg3yLla%VmQjL1*Tv9M{N(`%4r=$)Dk@BqvBl%DOjbQe6T*g;laY)lG8Z)tI^Y*vKxOG zm&~sf-Znb~?oN|q4Fid|Tw|!(4p_*lQXL$CTY`ISN0y&`%<~`h-Z>&JWnz_6u8~Cb zC6Sx@Sxa>cjipu1y+M;rZDFxy&<8trXzYN4B(b@w4H|$uwI}fz`lm=_7y1_B#5<-X zVP$qr^1*gCIT+|`R{U6C?h?hH=YPvSjB5&G(kY`Zq1vaaZ~Xdv`?TZF74{W@AJBhf zMN;)863wnVtEau740Ssy#P_6VZIQp^YHfAQ^|{uQ=FO(IJeb*|Jd} z41vx%>!aK~{Hrc*dWU&`IekK*dG6i5(cO3=lI;lF?m0uYs}KQJ$R3kEV{^6ofq_Fx zT- z+^Vj)m@Fi!cb@|ci~{h9`rVAYmX}~|ooeoV#_x<@Xry4AiM%JXjxt$m7}T;FIek_^ z#>ITFu-M#s@|NK*E`N>1z#*@W$q(&v@s1{*$QOEt;t%uVE|*C=*ft7>eKuJKbWVC7 zjKNDOqkC$44y9#2Vc81{7*!d&-=|#KRat8~+%O(9 zmDQn|>|+3$J0123vzeo5CSUL5-7&?g*;TZ)*7MD8(?<|G7E#3<)?7a9Hm@M>eZl<* zBN!d8ZNjSI4;K!x*oHvGx>aYAh+&$PHT>J;%l0GjhVyXadEubA72ZkJwp-(+uk4SZ zP63ye$9~th#0p|uLa`e;E2$bbA=UI}(g;AZs8NO@aCLWTr-Lb?^x%k6LR0aMGey?T zFeqaRoRr^Dgev=tdcP#oV5|0g`CIc5cEkjKv*xQ1{UvV#DK@Zrt7BfQC|B6%*HNR5 z%p*{o$riZ-CC%9TLFb#g7UgoQ*Cc#3If+A%-5bi!ZOw}P4$>$Pk~}Sj+d-Xr8Z*Lj8(5>_Q+*AD!0d68>qBuPtMW| zppOmvB-v^rgFR_E1u4*DT@RMTR58oj-`7sZs-6N}>AHT=0#RaMo0|5QLe-?S|0Ric z8dTS3er4*IE+NU~h6ZV$b7`7Dy8f^bFvm8?bGqI+6f0d?=ir6@ zvo+-}Z{B4lZK_0GBBBDQ<3{x)oB|G)Ob@aasMT^08`=OQu)5_k>0j0gxIl5KLmx$M zR2J*Hr8B8zQa*>4OvZB?wXGYfrhC)WZDahUq%>>ipB817cq%)l616?|yqNK$x*r`+ z&PcuY+F&xmD-EZoAhjGq^Fs}DVtHU?Du8a1KenIL%Ooro} zZ}?Sow2EHIlK&YJS>9JGsA$HTI{7>m#iIKS~O-ZkI!Q}wj?Bf42>qHAq z2hBj*BXMuvskxthvdb?7=w^Nni;Y7;73X4XBA531>qS`p&T{b0qgUCMfmW|juQ^Wg zombO0zOx@~V^FBGwVj~MK8y_rn)?I{p;5A0-Pvz|dw!Pid@``>Iyd6&C}pMSNW;!Gp{OP$}ZU_c1qRFjEa+wcXN~ zSbKpz64NU8IZBT+o?oWKuHJjPGqvrrsP%g%>7<&s1I_gjKI|?Xjt%X;@#KP?!5sSt z{8T5S!&tyWu-1PmMqjio{M$tkw=v=6G6)l=upKAWBd*Dzff_$3^U%g{wCTkxJ@ z{4@SOyUq_EwFS|^y=KU@B6W&7%L*~)FxiC=Yf^Hg>(|Jpz%|wg z5!hP%*0}$i(6(|$KGS$rvm`@c6XQzs%-4K09hLc@;@8&r?NnQzi2@yTmlX zJQk6cFfTN7wPa@<^WpTN{X_m+l)8IzKcODr|GQR@S&kG(jeGe|gk;KCsw-P5Dj1(yrN>=zs=10Us12>kJf42o8)Kcfo3X@m* z|IB1$x_Ooct+18b)VSgc&673SgX3ttnIk6bvOQ)-cr$>AIZ(tDb#>d47(PkoL6Q=B z8LFh&?bAnJ5RTjP_T%7$D|Xn9uclqZNx;qZ zCCPPrUVD?fKzz74)0`s4w@scfVTa21uC4DQ#rS}Ai;MTkvEt#WvmC5QTRn?a(I7qV zaCwD2ntRfuY4@wT0=?L2W9+pEnIBcbH4Jr6U#C<8NOzzuNnb&&%A%=;~k zKuT!VM;OzUT?*^G8m!SeQAiJd`n{}FQ@NGFepU&>q^#U;Q{cktvsyMwt42GijC$4* z-NnOAwsST#aZ4vrVv9M~h@AnFq>@k|E(IBrBviMZ11sOUwB>#eo1 z9z3HK1|zxE+F*>?6N7i+B6<3odNTs)P`FnPLXZ4gKB|jXMo8qciByi2T_xGIAD>rb z=H=fye96VoI?c&C$+?5n_#*1g%wH8MW$#@-<=t`5dt>akPZSm*b)@P{xBT)jlvFB( zsod`LCYRG5FSHB-BaWYCX^-V~h9|UhH)Tg0+&^dZMI|=vkM`TWYr99py$t@O{19)W z+L8~n*wgANmjj35swN}JP!x7wM!fZ6oH(zkRi&z{4~r|A^;hIM8tHY6u&|}NI~)YX z?ZS5exc{s=joD6)R6YrHeb0TwuQ!GaGXDHEeE4qo?OP4F9X!L51d=WZ_Q7Wsji*%F z_xLM~ns*TPq2g@+`vACMnhPPgyn#DZX~VUAY8Y3Aa53y48|ABHk1Ot$ zx{ua+u>RVp$uz|U@L)fj`?Ran*NShq#;^ai-Eak+`4YK>?i!#j>dR?{hz|CQroy`7 zk~+)US$jJJTxa%C^)RycV&8FJP}1$RP_ZSt`yu`##Uq+tj32}cu^6Gvoi*kx1J=ne z9a6pc@Jrkmh4@|#HPcfENJ>%@^}9cRV|ZvE`Ye*e;&7!?W7zs!AB+nW!%7LX{g0R% zFP9zw2j1)7&ELrlwQFhhK8ufGp;dd`aSfk2PRnplE?8eB(B zI6KS7ySGCX*YukiN#&6-w{SL3tInUx`5Y2$PZO ze@%HOMu42O!DgxY%ye^g+>`MRa>9tbs5&Z`cCAG_7pk=vs#^{|DOHw_%2^6lBQxHT zgu>$!Z2X@Me{yDblxYidW0Vk)^u*cSn{(>VC%(Nr!Vc#fR4)#&GGwU?l8~R(;r5xH z3>CNW`<3V?A+7XIA@*)UXbQ~i6?Wrf zMSMO~fK>@BuhbYk+UT)X+mrmc@SgemLQ&_=6miqM`#}BPge*Z-kp*fA2D$6t9n?O} z2Md7z;CRP(UR~cW4R3AXlI~R1{4}EH_+(gFSB(sz!LIEAVX=8QqKch|fSwF$UyI8( zquxg=(0cVPEQ?F6?BybNLGJz)!>vz&tVFsti``piz6JC2E9aF=RSq~8bO8&x)t$%1 z*W&sv44v1oY0^uh5)?33;%E4KG~u{##Etcg1yGr+{qv@Y&}M7bx$$49|oth^#dJ zAs;>n-t=qiQ@xIlVQdzUs)~0SPB$<1K99Kcd#lS8Qg=u86A-l0EZ`pTlAq<(=0C6C z#{j33;IH_PvA)>UPw#bBgORhQ{Mr}d2z&)Ygw`e*dW}~$kB;Y=dbxi`HYa-p0(NiU zsg@W}*x}o3Y`ggV$&a!q=ee2LExX)&2QE*YvBt9DOe%`#uvLx+d@uOpg0Hq{XVSK`(9fcLK zYf_pSo_qdGJi5r;)e{V(g-Lp|e@n*EHPD zcgAUwtowR(^i@7NwLgifbgAatdvU@0cD~p!t!BZEV0j9vvQ1nLh`sg$h!okVx?%S9 z!Kb@#;BUk(=U8og_$IISJZ^%w*@RP3`p%m-h<4}k>p}0Qq^}>No*CzAG_6#7=J#v< z<3;@S!h2??!I@pkFb|ow5K|W0HSK69_j|nX9XLS#+W#;gF}ewv#bkq`m(CMK8s1lH z^>5u@P|);tu&pt-6|XnD}2wEz^(g9?>n*Ce7B_J||njK1= z3YqPoSOxcPEUpiet4vq@*ZkMQ?XaJ+It#MIu|@Lbo!=ymi0G;4skG~1-9C%Du1+o3 zL`u0OUIr&t5a$!{f<-#O)%=cJQK$sDQf2`Xc~kx9Emr7T4?eZdbT07?Vopq+A&(}yFyru=B=!c18v#@(%h!zTcg0b>e$@?f&U zAsWI(l5au`JkpO4JR7NRK`1G;wTJmH4plg|bBM1Xe~`{YlLvG?)_*>j7sKz(GQ4b7 zt66><-3>$6M(=7z{KC{SZaz0C{a`0o|M?-*yI=~~fpC~WZ`Tx&C0DDN0Eq;%YX#qg z)C~$!3;>YsV8=n8Dmcy)K{U|bV*G9>UD!HpM}2%dE6+Wn65Of9;$Tq#0nxB$>u>3h z8B#YU{eRh&1KS#NnWIl;_Fk4+ZW{Dv9cY4eNqpVUr_4DSKEpg+DR2?{VA&`y+e zl6W8hgbJ)*d4Y2b;aWoBD(gJ%Tt2`3OTtE;lQoe_V4xxn1}ifzE^_S_n+h2s)o-m8 z{^onb+&^C(Jg%L1sk2L6Yu*ZtqdonS^2YaWk*m@vK+29tU5NqCRHe9F68_yJ`LmIr9;J%2sVbz?a)>GdB zml+=WXlR{WcI=Hw)xM}_@3wq#`MZ7nqQ8sYKRv%+U-+@wG2fbhuW#K1L9dO%N$N-T z9og?+>GZkf8Rt}{=d9he-8-`P*qmk47CsSs zE6bs> zlG|%rRlP;TSSiir42LquCKk1;Wns4?bDv+ny^$rwa2^O=TJ?JMy7jyCPI~$k8CA^@ z<<=Gp(>e3vXT-g2dvYtIGuOY3yS;bYrAJ4*#r5OX*dKqhEOvfb?X9mtM>mQd50lYO z4RK4YnI>KBSlRwuc3%08EsH<(owC;QJ|{j$-y(j3(XP~z(?2}UE1xd@1csB!qTX(~ zm8tr+?AF^Yw@=QPeZgpY)GY9ra-vP&rmLsJ^rK^=jFZpym>Tyyht80BhVBY~8Mk!z zlAW_w?>t{G|843U?VI6~!uIX`^mb~#^g-u~oUZC3a}_N63*{c$9JBbhc4B^SP4<#4 zr}L-Z*Ry|l<4`hpzphDDM%tVyg+a$WgVusO`Kqb!X6?*=w$6=z^V|FR|LcB#2c}l< z^DATa7JWT+)w^i!TdUip-zLA_dZts{%Ce;BMM~z|dt0lozXMu-JAB)Eotx)2%}urT z?vjOcSc)b^bByma1~ z(j6+lC%y6Bz^$r>v<(@6Js>`fLVh^gGCN_9Qda+$C4@R^JWV?KyLM%DqXI-BT*VpT*8B_taW! zq&4}|A6ff1KN64g2Q5{bIx8eg=_wCznZaktrb6H->8psNM~)mjc2re;d6^b+HYMA9)S82ZU`Ji1q0+mod#kV3fK{Ye5uT+8$ls}eSsB|14s_Ij*R%T!$y-C zbUznaE83VGK*2p4;G^jg>%n}ZnQJt2fy;-{ihY=71;}*Oe_!wf=!b-?aPY2&idp}e X_a6ufca@Tf0>!_ltDnm{r-UW|BVbz6 literal 0 HcmV?d00001 diff --git a/themes/demo/base.twig b/themes/demo/base.twig new file mode 100644 index 0000000..f84bfd9 --- /dev/null +++ b/themes/demo/base.twig @@ -0,0 +1,136 @@ + + + + + + {{ page_title }} - {{ site_title }} + + + + + + + + + + + + + + + {% if block_ai_bots %} + + + {% endif %} + {% if block_search_engines %} + + {% endif %} + + + + + + + + + + + + + + + + {% if theme_css_url %} + + {% endif %} + + + + + + + + + {% include 'partials/header.twig' %} + + + + + +
+ {% block content %}{% endblock %} +
+ +
+ {% include 'partials/footer.twig' %} +
+ + + + {% if theme_js_url %} + + {% endif %} + + diff --git a/themes/demo/css/theme.scss b/themes/demo/css/theme.scss new file mode 100644 index 0000000..7f87162 --- /dev/null +++ b/themes/demo/css/theme.scss @@ -0,0 +1,331 @@ +// CodePress demo theme styles +// A distinct look to demonstrate that themes are fully swappable. + +// Theme color variables (defined per theme; used by the CSS custom properties below) +$header-bg: #613583; +$header-font: #ffffff; +$header-height: 120px; +$nav-bg: #813d9c; +$nav-font: #ffffff; +$nav-height: 50px; +$sidebar-bg: #f3e8f7; +$sidebar-border: #d8b4e0; + +// Optional header background image and overlay opacity +$header-bg-image: none; +$header-bg-opacity: 1; + +:root { + --header-bg: #{$header-bg}; + --header-font: #{$header-font}; + --header-height: #{$header-height}; + --nav-bg: #{$nav-bg}; + --nav-font: #{$nav-font}; + --nav-height: #{$nav-height}; + --sidebar-bg: #{$sidebar-bg}; + --sidebar-border: #{$sidebar-border}; +} + +// Header background (optional background image via $header-bg-image) +#site-header { + background-image: $header-bg-image; + background-size: cover; + background-position: center; + background-repeat: no-repeat; + position: relative; +} + +@if $header-bg-image != 'none' { + #site-header::before { + content: ''; + position: absolute; + inset: 0; + background-color: var(--header-bg); + opacity: $header-bg-opacity; + pointer-events: none; + z-index: 0; + } +} + +// Rounded, softer header +.navbar { + background-color: var(--header-bg) !important; + min-height: var(--header-height); + border-bottom: 4px solid var(--nav-bg) !important; + + .navbar-brand, + .navbar-text, + .form-control, + .btn { + color: var(--header-font) !important; + } + + .form-control::placeholder { + color: rgba(255, 255, 255, 0.7) !important; + } + + .btn-outline-light { + border-color: var(--header-font) !important; + } +} + +// Language dropdown styling +.dropdown-menu { + background-color: var(--header-bg) !important; + border: 1px solid var(--header-font) !important; +} + +.dropdown-item { + color: var(--header-font) !important; + + &:hover { + background-color: rgba(255, 255, 255, 0.1) !important; + color: var(--header-font) !important; + } +} + +.dropdown-toggle::after { + display: none !important; +} + +.btn-outline-light { + color: var(--header-font) !important; + border-color: var(--header-font) !important; + + &:hover { + background-color: rgba(255, 255, 255, 0.1) !important; + color: var(--header-font) !important; + } + + &:focus, + &:active, + .show > &.dropdown-toggle { + background-color: rgba(255, 255, 255, 0.1) !important; + color: var(--header-font) !important; + border-color: var(--header-font) !important; + box-shadow: none !important; + } +} + +.bi-chevron-down { + font-size: 0.75em; + margin-left: 0.25rem; +} + +// Breadcrumb +.breadcrumb-item + .breadcrumb-item::before { + content: "" !important; + padding: 0 !important; +} + +.breadcrumb { + --bs-breadcrumb-divider: ""; + + .breadcrumb-item { + color: var(--nav-font) !important; + + a { + color: var(--nav-font) !important; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } + } +} + +.sidebar-toggle-item { + display: flex; + align-items: center; + margin-right: 0.5rem; +} + +.sidebar-toggle-btn { + padding: 0; + line-height: 1; + font-size: 1.1rem; + color: var(--header-bg) !important; + border: none !important; + background: transparent !important; + box-shadow: none !important; + cursor: pointer; + + &:hover { + opacity: 0.7; + } +} + +.sidebar-column { + transition: all 0.3s ease; +} + +.sidebar-hidden { + display: none !important; +} + +// Navigation section background +.navigation-section { + background-color: var(--nav-bg) !important; + color: var(--nav-font) !important; + min-height: var(--nav-height); +} + +// Accessibility +.focus-visible:focus, +.btn:focus, +.form-control:focus, +.nav-link:focus { + outline: 3px solid #0056b3 !important; + outline-offset: 2px !important; + box-shadow: 0 0 0 1px #ffffff, 0 0 0 4px #0056b3 !important; +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} + +.nav-tabs { + background-color: transparent !important; + border: none !important; + + .nav-link { + background-color: transparent !important; + border: none !important; + color: var(--nav-font) !important; + + &:hover { + background-color: rgba(255, 255, 255, 0.1) !important; + } + + &.active { + background-color: rgba(255, 255, 255, 0.2) !important; + border-bottom: 2px solid var(--nav-font) !important; + } + } +} + +// Sidebar styling - rounded cards look +.sidebar-column { + background-color: var(--sidebar-bg) !important; + border-right: 1px solid var(--sidebar-border) !important; + position: sticky; + top: 0; + min-height: calc(100vh - var(--header-height) - var(--nav-height) - 42px); +} + +.sidebar { + padding: 1.5rem; + height: 100%; + overflow-y: auto; + + .card { + border-radius: 1rem; + border: 1px solid var(--sidebar-border); + } +} + +.content-column { + background-color: #ffffff; +} + +.content-wrapper { + padding: 2rem; + padding-bottom: 80px !important; +} + +.main-content { + flex: 1; +} + +// Mobile responsive +@media (max-width: 767.98px) { + .sidebar-column { + border-right: none !important; + border-top: 1px solid var(--sidebar-border) !important; + min-height: auto; + margin-top: 1rem; + } + + .content-wrapper { + min-height: auto; + padding-bottom: 2rem !important; + } +} + +@media (max-width: 991.98px) { + .sidebar-column { + order: 2 !important; + } + + .content-column { + order: 1 !important; + } +} + +// Code block styling +pre { + background: #f8f9fa; + padding: 1rem; + border-radius: 6px; + overflow-x: auto; + border: 1px solid #dee2e6; + margin-bottom: 1rem; + + code { + background: none; + padding: 0; + color: #333; + font-size: 0.85rem; + line-height: 1.5; + } +} + +code { + background: #e8e8e8; + padding: 0.15rem 0.4rem; + border-radius: 3px; + font-size: 0.9em; + color: #d63384; +} + +// Footer icon hover effects +.footer-icon { + color: #6c757d; + text-decoration: none; + transition: all 0.2s ease-in-out; + display: inline-block; + padding: 2px; + + &:hover { + color: #0d6efd; + transform: translateY(-1px); + } + + &:active { + transform: translateY(0); + } + + &.guide:hover { + color: #198754; + } + + &.cms:hover { + color: #dc3545; + } + + &.git:hover { + color: #6f42c1; + } + + &.website:hover { + color: #fd7e14; + } +} diff --git a/themes/demo/custom1.twig b/themes/demo/custom1.twig new file mode 100644 index 0000000..4588091 --- /dev/null +++ b/themes/demo/custom1.twig @@ -0,0 +1,18 @@ +{% extends 'base.twig' %} + +{% block content %} +
+
+ +
+
+ {{ content|raw }} +
+
+
+
+{% endblock %} diff --git a/themes/demo/full_content.twig b/themes/demo/full_content.twig new file mode 100644 index 0000000..05f4748 --- /dev/null +++ b/themes/demo/full_content.twig @@ -0,0 +1,11 @@ +{% extends 'base.twig' %} + +{% block content %} +
+
+
+ {{ content|raw }} +
+
+
+{% endblock %} diff --git a/themes/demo/js/theme.js b/themes/demo/js/theme.js new file mode 100644 index 0000000..816a279 --- /dev/null +++ b/themes/demo/js/theme.js @@ -0,0 +1,21 @@ +// CodePress default theme JavaScript +// Loaded after the global app.js on every page. + +(function () { + 'use strict'; + + // Sidebar toggle (used by the breadcrumb toggle button) + function toggleSidebar() { + var sidebar = document.getElementById('site-sidebar'); + if (!sidebar) return; + sidebar.classList.toggle('sidebar-hidden'); + var btn = document.querySelector('.sidebar-toggle-btn'); + if (btn) { + var hidden = sidebar.classList.contains('sidebar-hidden'); + btn.setAttribute('aria-expanded', hidden ? 'false' : 'true'); + } + } + + // Expose for inline onclick handlers + window.toggleSidebar = toggleSidebar; +})(); diff --git a/themes/demo/left_sidebar.twig b/themes/demo/left_sidebar.twig new file mode 100644 index 0000000..89e3197 --- /dev/null +++ b/themes/demo/left_sidebar.twig @@ -0,0 +1,26 @@ +{% extends 'base.twig' %} + +{% block content %} +{% if sidebar_content %} +
+ +
+
+ {{ content|raw }} +
+
+
+{% else %} +
+
+
+ {{ content|raw }} +
+
+
+{% endif %} +{% endblock %} diff --git a/themes/demo/partials/footer.twig b/themes/demo/partials/footer.twig new file mode 100644 index 0000000..78cd213 --- /dev/null +++ b/themes/demo/partials/footer.twig @@ -0,0 +1,48 @@ +
+
+
+
+
+
+ + + {{ page_title }} + {% if file_info_block %} + + {% if show_created %} + + {{ created }} + {% endif %} + + {{ modified }} + + {% endif %} + +
+
+ + + + + | + {% if cms_version %} + {{ cms_version }} + {% endif %} + + + + | + + + + | + + + + +
+
+
+
+
+
diff --git a/themes/demo/partials/header.twig b/themes/demo/partials/header.twig new file mode 100644 index 0000000..a71f4da --- /dev/null +++ b/themes/demo/partials/header.twig @@ -0,0 +1,75 @@ + diff --git a/themes/demo/partials/navigation.twig b/themes/demo/partials/navigation.twig new file mode 100644 index 0000000..32e76e1 --- /dev/null +++ b/themes/demo/partials/navigation.twig @@ -0,0 +1,17 @@ + diff --git a/themes/demo/right_sidebar.twig b/themes/demo/right_sidebar.twig new file mode 100644 index 0000000..630bcf1 --- /dev/null +++ b/themes/demo/right_sidebar.twig @@ -0,0 +1,26 @@ +{% extends 'base.twig' %} + +{% block content %} +{% if sidebar_content %} +
+
+
+ {{ content|raw }} +
+
+ +
+{% else %} +
+
+
+ {{ content|raw }} +
+
+
+{% endif %} +{% endblock %} diff --git a/themes/demo/theme.json b/themes/demo/theme.json new file mode 100644 index 0000000..a3adb20 --- /dev/null +++ b/themes/demo/theme.json @@ -0,0 +1,12 @@ +{ + "title": "demo", + "config": { + "default_template": "left_sidebar" + }, + "template": { + "full_content": "full_content.twig", + "left_sidebar": "left_sidebar.twig", + "right_sidebar": "right_sidebar.twig", + "custom1": "custom1.twig" + } +} diff --git a/themes/demo/theme.png b/themes/demo/theme.png new file mode 100644 index 0000000000000000000000000000000000000000..f213bef4121b3dad839e4a1035285ae41c74dbd0 GIT binary patch literal 21121 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π0GWj5&JLVQI!v%+Ujw+pY7k3h=$v_{jNp+yrl zQ8j-RdgqRG7pF4wuFqq{ee?QrLE08-w%btyvQd6s!DHL5LsjUMW6o>^N{{eYyL;1e z;A}ZO`toT`Iua>G&uc&Bo>x7tcPiy?xw{*eW@K7znW^UN-e@gF9?6x{Bb=oY50q=y zm_Fi6G+&C6=v-Q&H=_T)ZGmGm8?Tf{-rqaFc78Rknvn~d*1Nsm447W4{X{EvAGpnW zZ`z);%CnzleSJ~2w)l~&f8RVA+sLTR>1XGeR;w&e0Kt;s-Lve)+8xA_rA zZ`~3u_`Tq5^EQ5?d5^z)P1lNDRic@Bd4_MYS+8M}|Ld5RxZpj@Dts${{kGS?_TW?I z{qFBY@1Nc~y|iZq5Nc!=zB{^8{JB}%rtsOJxnW!FE9zU5xsQwWnLe|MnNwbP?`Y*x zai(~V8byQ8i>&-lfyY9!gO(ng$`&rAvsQb{x(mCUCaF#b!H>0K?_>59e>^wy`MW>6 zZ^(lNQ$w`!^r`2yZq}BGHH(38zJdgBsO)^7Z_=Z!*_xVS-eKZQ3>6mQ;`#aR$JeX_FP`~uzf17| z0~ipoRbf;iI0T44I0(m@wUL^c}Nqj3#R?4#B2XjULH xE6k`315Ty>cwh41KqE6dUrMPcC $vendorDir . '/symfony/deprecation-contracts/function.php', + '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', + '89efb1254ef2d1c5d80096acd12c4098' => $vendorDir . '/twig/twig/src/Resources/core.php', + 'ffecb95d45175fd40f75be8a23b34f90' => $vendorDir . '/twig/twig/src/Resources/debug.php', + 'c7baa00073ee9c61edf148c51917cfb4' => $vendorDir . '/twig/twig/src/Resources/escaper.php', + 'f844ccf1d25df8663951193c3fc307c8' => $vendorDir . '/twig/twig/src/Resources/string_loader.php', ); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index e6e3777..a9c8cf0 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -6,14 +6,27 @@ $vendorDir = dirname(__DIR__); $baseDir = dirname($vendorDir); return array( + 'Twig\\' => array($vendorDir . '/twig/twig/src'), 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), + 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), + 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), + 'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'), + 'SourceSpan\\' => array($vendorDir . '/scssphp/source-span/src'), + 'ScssPhp\\ScssPhp\\' => array($vendorDir . '/scssphp/scssphp/src'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/src'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'), 'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'), 'PhpMqtt\\Client\\' => array($vendorDir . '/php-mqtt/client/src'), 'Nette\\' => array($vendorDir . '/nette/schema/src', $vendorDir . '/nette/utils/src'), 'MyCLabs\\Enum\\' => array($vendorDir . '/myclabs/php-enum/src'), 'Mustache\\' => array($vendorDir . '/mustache/mustache/src'), + 'MaxMind\\WebService\\' => array($vendorDir . '/maxmind/web-service-common/src/WebService'), + 'MaxMind\\Exception\\' => array($vendorDir . '/maxmind/web-service-common/src/Exception'), + 'MaxMind\\Db\\' => array($vendorDir . '/maxmind-db/reader/src/MaxMind/Db'), + 'League\\Uri\\' => array($vendorDir . '/league/uri', $vendorDir . '/league/uri-interfaces'), 'League\\Config\\' => array($vendorDir . '/league/config/src'), 'League\\CommonMark\\' => array($vendorDir . '/league/commonmark/src'), + 'GeoIp2\\' => array($vendorDir . '/geoip2/geoip2/src'), 'Dflydev\\DotAccessData\\' => array($vendorDir . '/dflydev/dot-access-data/src'), + 'Composer\\CaBundle\\' => array($vendorDir . '/composer/ca-bundle/src'), ); diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index e8aebd0..dbb30d2 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -8,17 +8,33 @@ class ComposerStaticInit071586d19f5409de22b3235d85d8476c { public static $files = array ( '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', + '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', + '89efb1254ef2d1c5d80096acd12c4098' => __DIR__ . '/..' . '/twig/twig/src/Resources/core.php', + 'ffecb95d45175fd40f75be8a23b34f90' => __DIR__ . '/..' . '/twig/twig/src/Resources/debug.php', + 'c7baa00073ee9c61edf148c51917cfb4' => __DIR__ . '/..' . '/twig/twig/src/Resources/escaper.php', + 'f844ccf1d25df8663951193c3fc307c8' => __DIR__ . '/..' . '/twig/twig/src/Resources/string_loader.php', ); public static $prefixLengthsPsr4 = array ( + 'T' => + array ( + 'Twig\\' => 5, + ), 'S' => array ( 'Symfony\\Polyfill\\Php80\\' => 23, + 'Symfony\\Polyfill\\Mbstring\\' => 26, + 'Symfony\\Polyfill\\Ctype\\' => 23, + 'Symfony\\Component\\Filesystem\\' => 29, + 'SourceSpan\\' => 11, + 'ScssPhp\\ScssPhp\\' => 16, ), 'P' => array ( 'Psr\\Log\\' => 8, + 'Psr\\Http\\Message\\' => 17, 'Psr\\EventDispatcher\\' => 20, 'PhpMqtt\\Client\\' => 15, ), @@ -30,27 +46,68 @@ class ComposerStaticInit071586d19f5409de22b3235d85d8476c array ( 'MyCLabs\\Enum\\' => 13, 'Mustache\\' => 9, + 'MaxMind\\WebService\\' => 19, + 'MaxMind\\Exception\\' => 18, + 'MaxMind\\Db\\' => 11, ), 'L' => array ( + 'League\\Uri\\' => 11, 'League\\Config\\' => 14, 'League\\CommonMark\\' => 18, ), + 'G' => + array ( + 'GeoIp2\\' => 7, + ), 'D' => array ( 'Dflydev\\DotAccessData\\' => 22, ), + 'C' => + array ( + 'Composer\\CaBundle\\' => 18, + ), ); public static $prefixDirsPsr4 = array ( + 'Twig\\' => + array ( + 0 => __DIR__ . '/..' . '/twig/twig/src', + ), 'Symfony\\Polyfill\\Php80\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', ), + 'Symfony\\Polyfill\\Mbstring\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', + ), + 'Symfony\\Polyfill\\Ctype\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', + ), + 'Symfony\\Component\\Filesystem\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/filesystem', + ), + 'SourceSpan\\' => + array ( + 0 => __DIR__ . '/..' . '/scssphp/source-span/src', + ), + 'ScssPhp\\ScssPhp\\' => + array ( + 0 => __DIR__ . '/..' . '/scssphp/scssphp/src', + ), 'Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/src', ), + 'Psr\\Http\\Message\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/http-factory/src', + 1 => __DIR__ . '/..' . '/psr/http-message/src', + ), 'Psr\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/psr/event-dispatcher/src', @@ -72,6 +129,23 @@ class ComposerStaticInit071586d19f5409de22b3235d85d8476c array ( 0 => __DIR__ . '/..' . '/mustache/mustache/src', ), + 'MaxMind\\WebService\\' => + array ( + 0 => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService', + ), + 'MaxMind\\Exception\\' => + array ( + 0 => __DIR__ . '/..' . '/maxmind/web-service-common/src/Exception', + ), + 'MaxMind\\Db\\' => + array ( + 0 => __DIR__ . '/..' . '/maxmind-db/reader/src/MaxMind/Db', + ), + 'League\\Uri\\' => + array ( + 0 => __DIR__ . '/..' . '/league/uri', + 1 => __DIR__ . '/..' . '/league/uri-interfaces', + ), 'League\\Config\\' => array ( 0 => __DIR__ . '/..' . '/league/config/src', @@ -80,10 +154,18 @@ class ComposerStaticInit071586d19f5409de22b3235d85d8476c array ( 0 => __DIR__ . '/..' . '/league/commonmark/src', ), + 'GeoIp2\\' => + array ( + 0 => __DIR__ . '/..' . '/geoip2/geoip2/src', + ), 'Dflydev\\DotAccessData\\' => array ( 0 => __DIR__ . '/..' . '/dflydev/dot-access-data/src', ), + 'Composer\\CaBundle\\' => + array ( + 0 => __DIR__ . '/..' . '/composer/ca-bundle/src', + ), ); public static $classMap = array ( diff --git a/vendor/composer/ca-bundle/LICENSE b/vendor/composer/ca-bundle/LICENSE new file mode 100644 index 0000000..c5b5220 --- /dev/null +++ b/vendor/composer/ca-bundle/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2016 Composer + +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/ca-bundle/README.md b/vendor/composer/ca-bundle/README.md new file mode 100644 index 0000000..d8205ec --- /dev/null +++ b/vendor/composer/ca-bundle/README.md @@ -0,0 +1,85 @@ +composer/ca-bundle +================== + +Small utility library that lets you find a path to the system CA bundle, +and includes a fallback to the Mozilla CA bundle. + +Originally written as part of [composer/composer](https://github.com/composer/composer), +now extracted and made available as a stand-alone library. + + +Installation +------------ + +Install the latest version with: + +```bash +$ composer require composer/ca-bundle +``` + + +Requirements +------------ + +* PHP 5.3.2 is required but using the latest version of PHP is highly recommended. + + +Basic usage +----------- + +### `Composer\CaBundle\CaBundle` + +- `CaBundle::getSystemCaRootBundlePath()`: Returns the system CA bundle path, or a path to the bundled one as fallback +- `CaBundle::getBundledCaBundlePath()`: Returns the path to the bundled CA file +- `CaBundle::validateCaFile($filename)`: Validates a CA file using openssl_x509_parse only if it is safe to use +- `CaBundle::isOpensslParseSafe()`: Test if it is safe to use the PHP function openssl_x509_parse() +- `CaBundle::reset()`: Resets the static caches + + +#### To use with curl + +```php +$curl = curl_init("https://example.org/"); + +$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath(); +if (is_dir($caPathOrFile)) { + curl_setopt($curl, CURLOPT_CAPATH, $caPathOrFile); +} else { + curl_setopt($curl, CURLOPT_CAINFO, $caPathOrFile); +} + +$result = curl_exec($curl); +``` + +#### To use with php streams + +```php +$opts = array( + 'http' => array( + 'method' => "GET" + ) +); + +$caPathOrFile = \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath(); +if (is_dir($caPathOrFile)) { + $opts['ssl']['capath'] = $caPathOrFile; +} else { + $opts['ssl']['cafile'] = $caPathOrFile; +} + +$context = stream_context_create($opts); +$result = file_get_contents('https://example.com', false, $context); +``` + +#### To use with Guzzle + +```php +$client = new \GuzzleHttp\Client([ + \GuzzleHttp\RequestOptions::VERIFY => \Composer\CaBundle\CaBundle::getSystemCaRootBundlePath() +]); +``` + +License +------- + +composer/ca-bundle is licensed under the MIT License, see the LICENSE file for details. diff --git a/vendor/composer/ca-bundle/composer.json b/vendor/composer/ca-bundle/composer.json new file mode 100644 index 0000000..c2ce2bb --- /dev/null +++ b/vendor/composer/ca-bundle/composer.json @@ -0,0 +1,54 @@ +{ + "name": "composer/ca-bundle", + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "type": "library", + "license": "MIT", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8 || ^9", + "phpstan/phpstan": "^1.10", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "Composer\\CaBundle\\": "tests" + } + }, + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "scripts": { + "test": "@php phpunit", + "phpstan": "@php phpstan analyse" + } +} diff --git a/vendor/composer/ca-bundle/res/cacert.pem b/vendor/composer/ca-bundle/res/cacert.pem new file mode 100644 index 0000000..26ec7f7 --- /dev/null +++ b/vendor/composer/ca-bundle/res/cacert.pem @@ -0,0 +1,2910 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Thu Jul 16 03:12:01 2026 GMT +## +## Find updated versions here: https://curl.se/docs/caextract.html +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://raw.githubusercontent.com/mozilla-firefox/firefox/refs/heads/release/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.33. +## SHA256: e57912808daef7b2b0fa4df2ccf17e47aeaf26c839a38f85c76003ebafd866bd +## + + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +======================================== +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +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 +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +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 +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +GDCA TrustAUTH R5 ROOT +====================== +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw +BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD +DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow +YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs +AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p +OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr +pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ +9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ +xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM +R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ +D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 +oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx +9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 +H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 +6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd ++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ +HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD +F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ +8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv +/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT +aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +SSL.com Root Certification Authority RSA +======================================== +-----BEGIN CERTIFICATE----- +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 +WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +SSL.com Root Certification Authority ECC +======================================== +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv +BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy +MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO +BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ +8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR +hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT +jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW +e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z +5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority RSA R2 +============================================== +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w +DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u +MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI +DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD +VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh +hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w +cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO +Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ +B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh +CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim +9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto +RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm +JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 ++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp +qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 +++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx +Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G +guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz +OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 +CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq +lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR +rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 +hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX +9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority ECC +=========================================== +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy +BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw +MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM +LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy +3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O +BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe +5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ +N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm +m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +GlobalSign Root CA - R6 +======================= +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX +R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i +YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs +U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss +grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE +3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF +vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM +PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ +azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O +WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy +CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP +0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN +b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV +HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 +lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY +BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym +Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr +3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 +0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T +uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK +oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t +JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GC CA +=============================== +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD +SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo +MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa +Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL +ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr +VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab +NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E +AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk +AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +UCA Global G2 Root +================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x +NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU +cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT +oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV +8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS +h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o +LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ +R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe +KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa +4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc +OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 +8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo +5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A +Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 +yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX +c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo +jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk +bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x +ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn +RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== +-----END CERTIFICATE----- + +UCA Extended Validation Root +============================ +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u +IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G +A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs +iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF +Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu +eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR +59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH +0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR +el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv +B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth +WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS +NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS +3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL +BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM +aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 +dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb ++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW +F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi +GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc +GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi +djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr +dhh2n1ax +-----END CERTIFICATE----- + +Certigna Root CA +================ +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE +BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ +MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda +MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz +MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX +stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz +KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 +JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 +XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq +4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej +wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ +lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI +jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ +/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy +dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h +LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl +cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt +OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP +TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq +7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 +4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd +8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS +6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY +tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS +aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde +E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +emSign Root CA - G1 +=================== +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET +MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl +ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx +ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk +aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN +LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 +cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW +DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ +6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH +hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 +vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q +NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q ++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih +U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +emSign ECC Root CA - G3 +======================= +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG +A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg +MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 +MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 +ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc +58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr +MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D +CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 +jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +emSign Root CA - C1 +=================== +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx +EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp +Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD +ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up +ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ +Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX +OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V +I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms +lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ +XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD +ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp +/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 +NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 +wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ +BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +emSign ECC Root CA - C3 +======================= +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG +A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF +Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD +ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd +6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 +SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA +B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA +MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU +ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 3 +======================= +-----BEGIN CERTIFICATE----- +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 +dBb9HxEGmpv0 +-----END CERTIFICATE----- + +Microsoft ECC Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND +IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 +MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 +thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB +eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM ++Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf +Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR +eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +Microsoft RSA Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg +UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw +NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u +MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml +7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e +S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 +1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ +dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F +yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS +MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr +lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ +0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ +ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og +6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 +dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk ++ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex +/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy +AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW +ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE +7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT +c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D +5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +e-Szigno Root CA 2017 +===================== +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw +DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt +MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa +Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE +CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp +Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx +s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G +A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv +vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA +tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO +svxyqltZ+efcMQ== +-----END CERTIFICATE----- + +certSIGN Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw +EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy +MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH +TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 +N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk +abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg +wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp +dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh +ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 +jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf +95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc +z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL +iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud +DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB +ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB +/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 +8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 +BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW +atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU +Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M +NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N +0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +NAVER Global Root Certification Authority +========================================= +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG +A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD +DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 +NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT +UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb +UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW ++j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 +XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 +aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 +Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z +VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B +A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai +cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy +YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV +HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK +21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB +jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx +hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg +E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH +D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ +A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY +qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG +I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg +kpzNNIaRkPpkUZ3+/uul9XXeifdy +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM SERVIDORES SEGUROS +=================================== +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF +UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy +NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 +MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt +UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB +QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 +LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG +SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD +zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= +-----END CERTIFICATE----- + +GlobalSign Root R46 +=================== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv +b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX +BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es +CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ +r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje +2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt +bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj +K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 +12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on +ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls +eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 +vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM +BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy +gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 +CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm +OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq +JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye +qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz +nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 +DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 +QEUxeCp6 +-----END CERTIFICATE----- + +GlobalSign Root E46 +=================== +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT +AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg +RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV +BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB +jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj +QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL +gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk +vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ +CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +ANF Secure Server Root CA +========================= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Certum EC-384 CA +================ +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ +TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 +MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh +dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq +vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn +iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo +ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 +QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +Certum Trusted Root CA +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +TunTrust Root CA +================ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +HARICA TLS RSA Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG +EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz +OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl +bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB +IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN +JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu +a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y +Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K +5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv +dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR +0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH +GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm +haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ +CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU +EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq +QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD +QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR +j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 +vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 +qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 +Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ +PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn +kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= +-----END CERTIFICATE----- + +HARICA TLS ECC Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH +UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD +QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX +DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj +IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv +b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l +AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b +ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW +0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi +rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw +CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud +DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w +gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A +bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL +4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb +LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il +I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP +cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA +LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A +lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH +9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf +NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE +ZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +vTrus ECC Root CA +================= +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE +BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS +b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa +BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c +ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n +TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT +QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL +YgmRWAD5Tfs0aNoJrSEGGJTO +-----END CERTIFICATE----- + +vTrus Root CA +============= +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG +A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv +b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG +A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots +SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI +ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF +XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA +YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 +kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 +AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu +/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu +1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO +9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg +scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC +AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr +jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 +8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn +xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg +icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 +sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW +nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc +SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H +l3s= +-----END CERTIFICATE----- + +ISRG Root X2 +============ +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV +UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT +UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT +MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS +RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H +ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb +d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF +cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 +U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +HiPKI Root CA - G1 +================== +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ +IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT +AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg +Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 +o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k +wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE +YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA +GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd +hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj +1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 +9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ +Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF +8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD +AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl +tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE +wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q +JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv +5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz +jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg +hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb +yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ +yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW +ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI +KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg +UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +GTS Root R1 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 +xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w +B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW +nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk +9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq +kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A +K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX +V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW +cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD +ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi +ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar +J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci +NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me +LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF +fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ +7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 +FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 +gm3c +-----END CERTIFICATE----- + +GTS Root R3 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq +Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT +L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV +11RZt+cRLInUue4X +-----END CERTIFICATE----- + +GTS Root R4 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 +PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C +r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh +4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +Telia Root CA v2 +================ +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT +AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 +MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK +DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 +6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q +9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn +pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl +tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW +5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr +RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E +BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 +M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau +BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W +xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 +tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H +eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C +y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC +QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 +h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 +sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 +xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ +raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= +-----END CERTIFICATE----- + +D-TRUST BR Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 +dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu +QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom +AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +D-TRUST EV Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 +ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ +raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR +AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +DigiCert TLS ECC P384 Root G5 +============================= +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 +NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg +Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd +lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj +n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB +/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds +Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx +AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +DigiCert TLS RSA4096 Root G5 +============================ +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 +MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 +IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 +7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU +AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces +tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa +zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV +DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q +TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy +z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ +MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk +wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E +FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN +lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN +MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ +u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G +OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh +47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU +FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ +yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP +bEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +Certainly Root R1 +================= +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE +BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN +MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy +dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O +5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl +8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl +DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI +XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN +KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ +AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb +rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 +VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS +p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz +HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v +MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB +GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ +gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH +JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 +fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw +x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S +X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +Certainly Root E1 +================= +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV +UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 +MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu +bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 +fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 +YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E +AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 +rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +Security Communication ECC RootCA1 +================================== +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD +VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t +dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL +MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV +BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo +5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW +BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK +BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L +snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e +N9k= +-----END CERTIFICATE----- + +BJCA Global Root CA1 +==================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG +EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK +Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG +A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD +DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm +CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS +sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn +P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW +yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj +eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn +MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b +OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh +GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK +H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB +AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ +dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 +60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh +TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW +4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp +GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx +4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps +3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S +SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= +-----END CERTIFICATE----- + +BJCA Global Root CA2 +==================== +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD +TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg +R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE +BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC +SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl +SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK +/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI +1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 +W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g +UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root E46 +============================================= +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH +QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2 +ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5 +WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0 +aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr +gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0 +NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud +DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH +lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U +SAGKcw== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root R46 +============================================= +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1 +OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3 +DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k +1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf +GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP +FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu +ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz +Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A +wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF +plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ +EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW +6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI +IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp +E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4 +exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M +0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI +84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m +pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd +Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b +E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm +J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +SSL.com TLS RSA Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG +EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg +Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC +VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u +9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y +7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac +oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M +R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG +D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW +TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk +8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq +g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk +7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu +N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt +hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN +j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by +iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU +o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo +ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib +MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi +vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7 +P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0 +9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= +-----END CERTIFICATE----- + +SSL.com TLS ECC Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v +dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx +GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy +JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1 +5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7 +81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG +MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w +7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5 +Zn6g6g== +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA ECC TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB +dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD +VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg +VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT +AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K +DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS +b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX +NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+ +uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY +a3cpetskz2VAv9LcjBHo9H1/IISpQuQo +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA RSA TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD +DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw +CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0 +b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV +BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB +l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG +vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK +ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt +0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK +PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY +sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY +Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+ +rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa +fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G +CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS +4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl +Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX +AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G +slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt +afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q +TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj +1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l +PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W +HYMfRsCbvUOZ58SWLs5fyQ== +-----END CERTIFICATE----- + +TrustAsia Global Root CA G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG +A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM +G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw +MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu +MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz +lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ +Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V +P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag +dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm +9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc +D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg +WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea +mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF +TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj +7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E +BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1 +D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T +G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj +duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl +cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys ++TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli +2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y +aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS +ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR +JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH +-----END CERTIFICATE----- + +TrustAsia Global Root CA G4 +=========================== +-----BEGIN CERTIFICATE----- +MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE +BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry +dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa +MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw +IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8 +m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/ +pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA +bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk +dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== +-----END CERTIFICATE----- + +Telekom Security TLS ECC Root 2020 +================================== +-----BEGIN CERTIFICATE----- +MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE +RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl +a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz +NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg +R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG +SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1 +2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC +MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ +Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU +ga/sf+Rn27iQ7t0l +-----END CERTIFICATE----- + +Telekom Security TLS RSA Root 2023 +================================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +TWCA CYBER Root CA +================== +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG +EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB +IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG +EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB +IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s +Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh +V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT +o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT +Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK +/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH +IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM +fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF +2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR +wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83 +QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB +AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN +c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x +X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR +IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq +/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R +FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe +Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv +It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl +IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X +-----END CERTIFICATE----- + +SecureSign Root CA14 +==================== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG +A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT +ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ +BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU +U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh +1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn +bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb +1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa +/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE +kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx +jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz +ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0 +dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY +AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq +YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E +rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA +ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds +Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG +FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q +nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/ +OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa +OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO +pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN +eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S +-----END CERTIFICATE----- + +SecureSign Root CA15 +==================== +-----BEGIN CERTIFICATE----- +MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE +BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1 +cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV +BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj +dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G +dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB +2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J +fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ +SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= +-----END CERTIFICATE----- + +D-TRUST BR Root CA 2 2023 +========================= +-----BEGIN CERTIFICATE----- +MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBIMQswCQYDVQQG +EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0Eg +MiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUwOTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTAT +BgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCT +cfKri3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNEgXtRr90z +sWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8k12b9py0i4a6Ibn08OhZ +WiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCTRphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6 +++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LUL +QyReS2tNZ9/WtT5PeB+UcSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIv +x9gvdhFP/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bSuREV +MweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+0bpwHJwh5Q8xaRfX +/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4NDfTisl01gLmB1IRpkQLLddCNxbU9 +CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUZ5Dw1t61GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRC +MEAwPqA8oDqGOGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y +XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tIFoE9c+CeJyrr +d6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67nriv6uvw8l5VAk1/DLQOj7aRv +U9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTRVFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4 +nj8+AybmTNudX0KEPUUDAxxZiMrcLmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdij +YQ6qgYF/6FKC0ULn4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff +/vtDhQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsGkoHU6XCP +pz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46ls/pdu4D58JDUjxqgejB +WoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aSEcr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/ +5usWDiJFAbzdNpQ0qTUmiteXue4Icr80knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jt +n/mtd+ArY0+ew+43u3gJhJ65bvspmZDogNOfJA== +-----END CERTIFICATE----- + +TrustAsia TLS ECC Root CA +========================= +-----BEGIN CERTIFICATE----- +MIICMTCCAbegAwIBAgIUNnThTXxlE8msg1UloD5Sfi9QaMcwCgYIKoZIzj0EAwMwWDELMAkGA1UE +BhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xIjAgBgNVBAMTGVRy +dXN0QXNpYSBUTFMgRUNDIFJvb3QgQ0EwHhcNMjQwNTE1MDU0MTU2WhcNNDQwNTE1MDU0MTU1WjBY +MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAG +A1UEAxMZVHJ1c3RBc2lhIFRMUyBFQ0MgUm9vdCBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLh/ +pVs/AT598IhtrimY4ZtcU5nb9wj/1WrgjstEpvDBjL1P1M7UiFPoXlfXTr4sP/MSpwDpguMqWzJ8 +S5sUKZ74LYO1644xST0mYekdcouJtgq7nDM1D9rs3qlKH8kzsaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQULIVTu7FDzTLqnqOH/qKYqKaT6RAwDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49 +BAMDA2gAMGUCMFRH18MtYYZI9HlaVQ01L18N9mdsd0AaRuf4aFtOJx24mH1/k78ITcTaRTChD15K +eAIxAKORh/IRM4PDwYqROkwrULG9IpRdNYlzg8WbGf60oenUoWa2AaU2+dhoYSi3dOGiMQ== +-----END CERTIFICATE----- + +TrustAsia TLS RSA Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIFgDCCA2igAwIBAgIUHBjYz+VTPyI1RlNUJDxsR9FcSpwwDQYJKoZIhvcNAQEMBQAwWDELMAkG +A1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xIjAgBgNVBAMT +GVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcNMjQwNTE1MDU0MTU3WhcNNDQwNTE1MDU0MTU2 +WjBYMQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEi +MCAGA1UEAxMZVHJ1c3RBc2lhIFRMUyBSU0EgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMMWuBtqpERz5dZO9LnPWwvB0ZqB9WOwj0PBuwhaGnrhB3YmH49pVr7+NmDQDIPN +lOrnxS1cLwUWAp4KqC/lYCZUlviYQB2srp10Zy9U+5RjmOMmSoPGlbYJQ1DNDX3eRA5gEk9bNb2/ +mThtfWza4mhzH/kxpRkQcwUqwzIZheo0qt1CHjCNP561HmHVb70AcnKtEj+qpklz8oYVlQwQX1Fk +zv93uMltrOXVmPGZLmzjyUT5tUMnCE32ft5EebuyjBza00tsLtbDeLdM1aTk2tyKjg7/D8OmYCYo +zza/+lcK7Fs/6TAWe8TbxNRkoDD75f0dcZLdKY9BWN4ArTr9PXwaqLEX8E40eFgl1oUh63kd0Nyr +z2I8sMeXi9bQn9P+PN7F4/w6g3CEIR0JwqH8uyghZVNgepBtljhb//HXeltt08lwSUq6HTrQUNoy +IBnkiz/r1RYmNzz7dZ6wB3C4FGB33PYPXFIKvF1tjVEK2sUYyJtt3LCDs3+jTnhMmCWr8n4uIF6C +FabW2I+s5c0yhsj55NqJ4js+k8UTav/H9xj8Z7XvGCxUq0DTbE3txci3OE9kxJRMT6DNrqXGJyV1 +J23G2pyOsAWZ1SgRxSHUuPzHlqtKZFlhaxP8S8ySpg+kUb8OWJDZgoM5pl+z+m6Ss80zDoWo8SnT +q1mt1tve1CuBAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLgHkXlcBvRG/XtZ +ylomkadFK/hTMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQwFAAOCAgEAIZtqBSBdGBanEqT3 +Rz/NyjuujsCCztxIJXgXbODgcMTWltnZ9r96nBO7U5WS/8+S4PPFJzVXqDuiGev4iqME3mmL5Dw8 +veWv0BIb5Ylrc5tvJQJLkIKvQMKtuppgJFqBTQUYo+IzeXoLH5Pt7DlK9RME7I10nYEKqG/odv6L +TytpEoYKNDbdgptvT+Bz3Ul/KD7JO6NXBNiT2Twp2xIQaOHEibgGIOcberyxk2GaGUARtWqFVwHx +tlotJnMnlvm5P1vQiJ3koP26TpUJg3933FEFlJ0gcXax7PqJtZwuhfG5WyRasQmr2soaB82G39tp +27RIGAAtvKLEiUUjpQ7hRGU+isFqMB3iYPg6qocJQrmBktwliJiJ8Xw18WLK7nn4GS/+X/jbh87q +qA8MpugLoDzga5SYnH+tBuYc6kIQX+ImFTw3OffXvO645e8D7r0i+yiGNFjEWn9hongPXvPKnbwb +PKfILfanIhHKA9jnZwqKDss1jjQ52MjqjZ9k4DewbNfFj8GQYSbbJIweSsCI3zWQzj8C9GRh3sfI +B5XeMhg6j6JCQCTl1jNdfK7vsU1P1FeQNWrcrgSXSYk0ly4wBOeY99sLAZDBHwo/+ML+TvrbmnNz +FrwFuHnYWa8G5z9nODmxfKuU4CkUpijy323imttUQ/hHWKNddBWcwauwxzQ= +-----END CERTIFICATE----- + +D-TRUST EV Root CA 2 2023 +========================= +-----BEGIN CERTIFICATE----- +MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBIMQswCQYDVQQG +EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0Eg +MiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUwOTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTAT +BgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1 +sJkKF8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE7CUXFId/ +MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFeEMbsh2aJgWi6zCudR3Mf +vc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6lHPTGGkKSv/BAQP/eX+1SH977ugpbzZM +lWGG2Pmic4ruri+W7mjNPU0oQvlFKzIbRlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3 +YG14C8qKXO0elg6DpkiVjTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq910 +7PncjLgcjmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZxTnXo +nMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ARZZaBhDM7DS3LAa +QzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nkhbDhezGdpn9yo7nELC7MmVcOIQxF +AZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knFNXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUqvyREBuHkV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRC +MEAwPqA8oDqGOGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y +XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14QvBukEdHjqOS +Mo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4pZt+UPJ26oUFKidBK7GB0aL2 +QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xD +UmPBEcrCRbH0O1P1aa4846XerOhUt7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V +4U/M5d40VxDJI3IXcI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuo +dNv8ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT2vFp4LJi +TZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs7dpn1mKmS00PaaLJvOwi +S5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNPgofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/ +HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAstNl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L ++KIkBI3Y4WNeApI02phhXBxvWHZks/wCuPWdCg== +-----END CERTIFICATE----- + +SwissSign RSA TLS Root CA 2022 - 1 +================================== +-----BEGIN CERTIFICATE----- +MIIFkzCCA3ugAwIBAgIUQ/oMX04bgBhE79G0TzUfRPSA7cswDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzErMCkGA1UEAxMiU3dpc3NTaWduIFJTQSBU +TFMgUm9vdCBDQSAyMDIyIC0gMTAeFw0yMjA2MDgxMTA4MjJaFw00NzA2MDgxMTA4MjJaMFExCzAJ +BgNVBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxKzApBgNVBAMTIlN3aXNzU2lnbiBSU0Eg +VExTIFJvb3QgQ0EgMjAyMiAtIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDLKmji +C8NXvDVjvHClO/OMPE5Xlm7DTjak9gLKHqquuN6orx122ro10JFwB9+zBvKK8i5VUXu7LCTLf5Im +gKO0lPaCoaTo+nUdWfMHamFk4saMla+ju45vVs9xzF6BYQ1t8qsCLqSX5XH8irCRIFucdFJtrhUn +WXjyCcplDn/L9Ovn3KlMd/YrFgSVrpxxpT8q2kFC5zyEEPThPYxr4iuRR1VPuFa+Rd4iUU1OKNlf +GUEGjw5NBuBwQCMBauTLE5tzrE0USJIt/m2n+IdreXXhvhCxqohAWVTXz8TQm0SzOGlkjIHRI36q +OTw7D59Ke4LKa2/KIj4x0LDQKhySio/YGZxH5D4MucLNvkEM+KRHBdvBFzA4OmnczcNpI/2aDwLO +EGrOyvi5KaM2iYauC8BPY7kGWUleDsFpswrzd34unYyzJ5jSmY0lpx+Gs6ZUcDj8fV3oT4MM0ZPl +EuRU2j7yrTrePjxF8CgPBrnh25d7mUWe3f6VWQQvdT/TromZhqwUtKiE+shdOxtYk8EXlFXIC+OC +eYSf8wCENO7cMdWP8vpPlkwGqnj73mSiI80fPsWMvDdUDrtaclXvyFu1cvh43zcgTFeRc5JzrBh3 +Q4IgaezprClG5QtO+DdziZaKHG29777YtvTKwP1H8K4LWCDFyB02rpeNUIMmJCn3nTsPBQIDAQAB +o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBRvjmKLk0Ow +4UD2p8P98Q+4DxU4pTAdBgNVHQ4EFgQUb45ii5NDsOFA9qfD/fEPuA8VOKUwDQYJKoZIhvcNAQEL +BQADggIBAKwsKUF9+lz1GpUYvyypiqkkVHX1uECry6gkUSsYP2OprphWKwVDIqO310aewCoSPY6W +lkDfDDOLazeROpW7OSltwAJsipQLBwJNGD77+3v1dj2b9l4wBlgzHqp41eZUBDqyggmNzhYzWUUo +8aWjlw5DI/0LIICQ/+Mmz7hkkeUFjxOgdg3XNwwQiJb0Pr6VvfHDffCjw3lHC1ySFWPtUnWK50Zp +y1FVCypM9fJkT6lc/2cyjlUtMoIcgC9qkfjLvH4YoiaoLqNTKIftV+Vlek4ASltOU8liNr3Cjlvr +zG4ngRhZi0Rjn9UMZfQpZX+RLOV/fuiJz48gy20HQhFRJjKKLjpHE7iNvUcNCfAWpO2Whi4Z2L6M +OuhFLhG6rlrnub+xzI/goP+4s9GFe3lmozm1O2bYQL7Pt2eLSMkZJVX8vY3PXtpOpvJpzv1/THfQ +wUY1mFwjmwJFQ5Ra3bxHrSL+ul4vkSkphnsh3m5kt8sNjzdbowhq6/TdAo9QAwKxuDdollDruF/U +KIqlIgyKhPBZLtU30WHlQnNYKoH3dtvi4k0NX/a3vgW0rk4N3hY9A4GzJl5LuEsAz/+MF7psYC0n +hzck5npgL7XTgwSqT0N1osGDsieYK7EOgLrAhV5Cud+xYJHT6xh+cHiudoO+cVrQkOPKwRYlZ0rw +tnu64ZzZ +-----END CERTIFICATE----- + +OISTE Server Root ECC G1 +======================== +-----BEGIN CERTIFICATE----- +MIICNTCCAbqgAwIBAgIQI/nD1jWvjyhLH/BU6n6XnTAKBggqhkjOPQQDAzBLMQswCQYDVQQGEwJD +SDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwYT0lTVEUgU2VydmVyIFJvb3Qg +RUNDIEcxMB4XDTIzMDUzMTE0NDIyOFoXDTQ4MDUyNDE0NDIyN1owSzELMAkGA1UEBhMCQ0gxGTAX +BgNVBAoMEE9JU1RFIEZvdW5kYXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IEVDQyBH +MTB2MBAGByqGSM49AgEGBSuBBAAiA2IABBcv+hK8rBjzCvRE1nZCnrPoH7d5qVi2+GXROiFPqOuj +vqQycvO2Ackr/XeFblPdreqqLiWStukhEaivtUwL85Zgmjvn6hp4LrQ95SjeHIC6XG4N2xml4z+c +KrhAS93mT6NjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBQ3TYhlz/w9itWj8UnATgwQ +b0K0nDAdBgNVHQ4EFgQUN02IZc/8PYrVo/FJwE4MEG9CtJwwDgYDVR0PAQH/BAQDAgGGMAoGCCqG +SM49BAMDA2kAMGYCMQCpKjAd0MKfkFFRQD6VVCHNFmb3U2wIFjnQEnx/Yxvf4zgAOdktUyBFCxxg +ZzFDJe0CMQCSia7pXGKDYmH5LVerVrkR3SW+ak5KGoJr3M/TvEqzPNcum9v4KGm8ay3sMaE641c= +-----END CERTIFICATE----- + +OISTE Server Root RSA G1 +======================== +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIQVaXZZ5Qoxu0M+ifdWwFNGDANBgkqhkiG9w0BAQwFADBLMQswCQYDVQQG +EwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwYT0lTVEUgU2VydmVyIFJv +b3QgUlNBIEcxMB4XDTIzMDUzMTE0MzcxNloXDTQ4MDUyNDE0MzcxNVowSzELMAkGA1UEBhMCQ0gx +GTAXBgNVBAoMEE9JU1RFIEZvdW5kYXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IFJT +QSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKqu9KuCz/vlNwvn1ZatkOhLKdxV +YOPMvLO8LZK55KN68YG0nnJyQ98/qwsmtO57Gmn7KNByXEptaZnwYx4M0rH/1ow00O7brEi56rAU +jtgHqSSY3ekJvqgiG1k50SeH3BzN+Puz6+mTeO0Pzjd8JnduodgsIUzkik/HEzxux9UTl7Ko2yRp +g1bTacuCErudG/L4NPKYKyqOBGf244ehHa1uzjZ0Dl4zO8vbUZeUapU8zhhabkvG/AePLhq5Svdk +NCncpo1Q4Y2LS+VIG24ugBA/5J8bZT8RtOpXaZ+0AOuFJJkk9SGdl6r7NH8CaxWQrbueWhl/pIzY ++m0o/DjH40ytas7ZTpOSjswMZ78LS5bOZmdTaMsXEY5Z96ycG7mOaES3GK/m5Q9l3JUJsJMStR8+ +lKXHiHUhsd4JJCpM4rzsTGdHwimIuQq6+cF0zowYJmXa92/GjHtoXAvuY8BeS/FOzJ8vD+HomnqT +8eDI278n5mUpezbgMxVz8p1rhAhoKzYHKyfMeNhqhw5HdPSqoBNdZH702xSu+zrkL8Fl47l6QGzw +Brd7KJvX4V84c5Ss2XCTLdyEr0YconosP4EmQufU2MVshGYRi3drVByjtdgQ8K4p92cIiBdcuJd5 +z+orKu5YM+Vt6SmqZQENghPsJQtdLEByFSnTkCz3GkPVavBpAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHwYDVR0jBBgwFoAU8snBDw1jALvsRQ5KH7WxszbNDo0wHQYDVR0OBBYEFPLJwQ8NYwC7 +7EUOSh+1sbM2zQ6NMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQwFAAOCAgEANGd5sjrG5T33 +I3K5Ce+SrScfoE4KsvXaFwyihdJ+klH9FWXXXGtkFu6KRcoMQzZENdl//nk6HOjG5D1rd9QhEOP2 +8yBOqb6J8xycqd+8MDoX0TJD0KqKchxRKEzdNsjkLWd9kYccnbz8qyiWXmFcuCIzGEgWUOrKL+ml +Sdx/PKQZvDatkuK59EvV6wit53j+F8Bdh3foZ3dPAGav9LEDOr4SfEE15fSmG0eLy3n31r8Xbk5l +8PjaV8GUgeV6Vg27Rn9vkf195hfkgSe7BYhW3SCl95gtkRlpMV+bMPKZrXJAlszYd2abtNUOshD+ +FKrDgHGdPY3ofRRsYWSGRqbXVMW215AWRqWFyp464+YTFrYVI8ypKVL9AMb2kI5Wj4kI3Zaq5tNq +qYY19tVFeEJKRvwDyF7YZvZFZSS0vod7VSCd9521Kvy5YhnLbDuv0204bKt7ph6N/Ome/msVuduC +msuY33OhkKCgxeDoAaijFJzIwZqsFVAzje18KotzlUBDJvyBpCpfOZC3J8tRd/iWkx7P8nd9H0aT +olkelUTFLXVksNb54Dxp6gS1HAviRkRNQzuXSXERvSS2wq1yVAb+axj5d9spLFKebXd7Yv0PTY6Y +MjAwcRLWJTXjn/hvnLXrahut6hDTlhZyBiElxky8j3C7DOReIoMt0r7+hVu05L0= +-----END CERTIFICATE----- + +e-Szigno TLS Root CA 2023 +========================= +-----BEGIN CERTIFICATE----- +MIICzzCCAjGgAwIBAgINAOhvGHvWOWuYSkmYCjAKBggqhkjOPQQDBDB1MQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xFzAVBgNVBGEMDlZBVEhV +LTIzNTg0NDk3MSIwIAYDVQQDDBllLVN6aWdubyBUTFMgUm9vdCBDQSAyMDIzMB4XDTIzMDcxNzE0 +MDAwMFoXDTM4MDcxNzE0MDAwMFowdTELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRYw +FAYDVQQKDA1NaWNyb3NlYyBMdGQuMRcwFQYDVQRhDA5WQVRIVS0yMzU4NDQ5NzEiMCAGA1UEAwwZ +ZS1Temlnbm8gVExTIFJvb3QgQ0EgMjAyMzCBmzAQBgcqhkjOPQIBBgUrgQQAIwOBhgAEAGgP36J8 +PKp0iGEKjcJMpQEiFNT3YHdCnAo4YKGMZz6zY+n6kbCLS+Y53wLCMAFSAL/fjO1ZrTJlqwlZULUZ +wmgcAOAFX9pQJhzDrAQixTpN7+lXWDajwRlTEArRzT/vSzUaQ49CE0y5LBqcvjC2xN7cS53kpDzL +Ltmt3999Cd8ukv+ho2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUWYQCYlpGePVd3I8KECgj3NXW+0UwHwYDVR0jBBgwFoAUWYQCYlpGePVd3I8KECgj3NXW+0Uw +CgYIKoZIzj0EAwQDgYsAMIGHAkIBLdqu9S54tma4n7Zwf2Z0z+yOfP7AAXmazlIC58PRDHpty7Ve +7hekm9sEdu4pKeiv+62sUvTXK9Z3hBC9xdIoaDQCQTV2WnXzkoYI9bIeCvZlC9p2x1L/Cx6AcCIw +wzPbGO2E14vs7dOoY4G1VnxHx1YwlGhza9IuqbnZLBwpvQy6uWWL +-----END CERTIFICATE----- diff --git a/vendor/composer/ca-bundle/src/CaBundle.php b/vendor/composer/ca-bundle/src/CaBundle.php new file mode 100644 index 0000000..6cf3b84 --- /dev/null +++ b/vendor/composer/ca-bundle/src/CaBundle.php @@ -0,0 +1,322 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace Composer\CaBundle; + +use Psr\Log\LoggerInterface; +use Symfony\Component\Process\PhpProcess; + +/** + * @author Chris Smith + * @author Jordi Boggiano + */ +class CaBundle +{ + /** @var string|null */ + private static $caPath; + /** @var array */ + private static $caFileValidity = array(); + + /** + * Returns the system CA bundle path, or a path to the bundled one + * + * This method was adapted from Sslurp. + * https://github.com/EvanDotPro/Sslurp + * + * (c) Evan Coury + * + * For the full copyright and license information, please see below: + * + * Copyright (c) 2013, Evan Coury + * 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. + * + * 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. + * + * @param LoggerInterface $logger optional logger for information about which CA files were loaded + * @return string path to a CA bundle file or directory + */ + public static function getSystemCaRootBundlePath(?LoggerInterface $logger = null) + { + if (self::$caPath !== null) { + return self::$caPath; + } + $caBundlePaths = array(); + + // If SSL_CERT_FILE env variable points to a valid certificate/bundle, use that. + // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. + $caBundlePaths[] = self::getEnvVariable('SSL_CERT_FILE'); + + // If SSL_CERT_DIR env variable points to a valid certificate/bundle, use that. + // This mimics how OpenSSL uses the SSL_CERT_FILE env variable. + $caBundlePaths[] = self::getEnvVariable('SSL_CERT_DIR'); + + $caBundlePaths[] = ini_get('openssl.cafile'); + $caBundlePaths[] = ini_get('openssl.capath'); + + $otherLocations = array( + '/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem', // Fedora, RHEL, CentOS (ca-certificates package) - NEW + '/etc/pki/tls/certs/ca-bundle.crt', // Fedora, RHEL, CentOS (ca-certificates package) - Deprecated + '/etc/ssl/certs/ca-certificates.crt', // Debian, Ubuntu, Gentoo, Arch Linux (ca-certificates package) + '/etc/ssl/ca-bundle.pem', // SUSE, openSUSE (ca-certificates package) + '/usr/ssl/certs/ca-bundle.crt', // Cygwin + '/opt/local/share/curl/curl-ca-bundle.crt', // OS X macports, curl-ca-bundle package + '/usr/local/share/curl/curl-ca-bundle.crt', // Default cURL CA bunde path (without --with-ca-bundle option) + '/usr/share/ssl/certs/ca-bundle.crt', // Really old RedHat? + '/etc/ssl/cert.pem', // OpenBSD + '/usr/local/etc/openssl/cert.pem', // OS X homebrew, openssl package + '/usr/local/etc/openssl@1.1/cert.pem', // OS X homebrew, openssl@1.1 package + '/opt/homebrew/etc/openssl@3/cert.pem', // macOS silicon homebrew, openssl@3 package + '/opt/homebrew/etc/openssl@1.1/cert.pem', // macOS silicon homebrew, openssl@1.1 package + '/etc/pki/tls/certs', + '/etc/ssl/certs', // FreeBSD + ); + + $caBundlePaths = array_merge($caBundlePaths, $otherLocations); + + foreach ($caBundlePaths as $caBundle) { + if ($caBundle && self::caFileUsable($caBundle, $logger)) { + return self::$caPath = $caBundle; + } + + if ($caBundle && self::caDirUsable($caBundle, $logger)) { + return self::$caPath = $caBundle; + } + } + + return self::$caPath = static::getBundledCaBundlePath(); // Bundled CA file, last resort + } + + /** + * Returns the path to the bundled CA file + * + * In case you don't want to trust the user or the system, you can use this directly + * + * @return string path to a CA bundle file + */ + public static function getBundledCaBundlePath() + { + $caBundleFile = __DIR__.'/../res/cacert.pem'; + + // cURL does not understand 'phar://' paths + // see https://github.com/composer/ca-bundle/issues/10 + if (0 === strpos($caBundleFile, 'phar://')) { + $tempCaBundleFile = tempnam(sys_get_temp_dir(), 'openssl-ca-bundle-'); + if (false === $tempCaBundleFile) { + throw new \RuntimeException('Could not create a temporary file to store the bundled CA file'); + } + + file_put_contents( + $tempCaBundleFile, + file_get_contents($caBundleFile) + ); + + register_shutdown_function(function() use ($tempCaBundleFile) { + @unlink($tempCaBundleFile); + }); + + $caBundleFile = $tempCaBundleFile; + } + + return $caBundleFile; + } + + /** + * Validates a CA file using opensl_x509_parse only if it is safe to use + * + * @param string $filename + * @param LoggerInterface $logger optional logger for information about which CA files were loaded + * + * @return bool + */ + public static function validateCaFile($filename, ?LoggerInterface $logger = null) + { + static $warned = false; + + if (isset(self::$caFileValidity[$filename])) { + return self::$caFileValidity[$filename]; + } + + $contents = file_get_contents($filename); + + if (is_string($contents) && strlen($contents) > 0) { + $contents = preg_replace("/^(\\-+(?:BEGIN|END))\\s+TRUSTED\\s+(CERTIFICATE\\-+)\$/m", '$1 $2', $contents); + if (null === $contents) { + // regex extraction failed + $isValid = false; + } else { + $isValid = (bool) openssl_x509_parse($contents); + } + } else { + $isValid = false; + } + + if ($logger) { + $logger->debug('Checked CA file '.realpath($filename).': '.($isValid ? 'valid' : 'invalid')); + } + + return self::$caFileValidity[$filename] = $isValid; + } + + /** + * Test if it is safe to use the PHP function openssl_x509_parse(). + * + * This checks if OpenSSL extensions is vulnerable to remote code execution + * via the exploit documented as CVE-2013-6420. + * + * @return bool + */ + public static function isOpensslParseSafe() + { + return true; + } + + /** + * Resets the static caches + * @return void + */ + public static function reset() + { + self::$caFileValidity = array(); + self::$caPath = null; + } + + /** + * @param string $name + * @return string|false + */ + private static function getEnvVariable($name) + { + if (isset($_SERVER[$name])) { + return (string) $_SERVER[$name]; + } + + if (PHP_SAPI === 'cli' && ($value = getenv($name)) !== false && $value !== null) { + return (string) $value; + } + + return false; + } + + /** + * @param string|false $certFile + * @param LoggerInterface|null $logger + * @return bool + */ + private static function caFileUsable($certFile, ?LoggerInterface $logger = null) + { + return $certFile + && self::isFile($certFile, $logger) + && self::isReadable($certFile, $logger) + && self::validateCaFile($certFile, $logger); + } + + /** + * @param string|false $certDir + * @param LoggerInterface|null $logger + * @return bool + */ + private static function caDirUsable($certDir, ?LoggerInterface $logger = null) + { + return $certDir + && self::isDir($certDir, $logger) + && self::isReadable($certDir, $logger) + && self::glob($certDir . '/*', $logger); + } + + /** + * @param string $certFile + * @param LoggerInterface|null $logger + * @return bool + */ + private static function isFile($certFile, ?LoggerInterface $logger = null) + { + $isFile = @is_file($certFile); + if (!$isFile && $logger) { + $logger->debug(sprintf('Checked CA file %s does not exist or it is not a file.', $certFile)); + } + + return $isFile; + } + + /** + * @param string $certDir + * @param LoggerInterface|null $logger + * @return bool + */ + private static function isDir($certDir, ?LoggerInterface $logger = null) + { + $isDir = @is_dir($certDir); + if (!$isDir && $logger) { + $logger->debug(sprintf('Checked directory %s does not exist or it is not a directory.', $certDir)); + } + + return $isDir; + } + + /** + * @param string $certFileOrDir + * @param LoggerInterface|null $logger + * @return bool + */ + private static function isReadable($certFileOrDir, ?LoggerInterface $logger = null) + { + $isReadable = @is_readable($certFileOrDir); + if (!$isReadable && $logger) { + $logger->debug(sprintf('Checked file or directory %s is not readable.', $certFileOrDir)); + } + + return $isReadable; + } + + /** + * @param string $pattern + * @param LoggerInterface|null $logger + * @return bool + */ + private static function glob($pattern, ?LoggerInterface $logger = null) + { + $certs = glob($pattern); + if ($certs === false) { + if ($logger) { + $logger->debug(sprintf("An error occurred while trying to find certificates for pattern: %s", $pattern)); + } + return false; + } + + if (count($certs) === 0) { + if ($logger) { + $logger->debug(sprintf("No CA files found for pattern: %s", $pattern)); + } + return false; + } + + return true; + } +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index f92df74..90cdeb5 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1,5 +1,80 @@ { "packages": [ + { + "name": "composer/ca-bundle", + "version": "1.5.13", + "version_normalized": "1.5.13.0", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "c008272789979f709f7fcb32c2ecf1d2db5e84e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/c008272789979f709f7fcb32c2ecf1d2db5e84e5", + "reference": "c008272789979f709f7fcb32c2ecf1d2db5e84e5", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "time": "2026-07-18T12:35:13+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.5.13" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "install-path": "./ca-bundle" + }, { "name": "dflydev/dot-access-data", "version": "v3.0.3", @@ -78,6 +153,67 @@ }, "install-path": "../dflydev/dot-access-data" }, + { + "name": "geoip2/geoip2", + "version": "v2.13.0", + "version_normalized": "2.13.0.0", + "source": { + "type": "git", + "url": "https://github.com/maxmind/GeoIP2-php.git", + "reference": "6a41d8fbd6b90052bc34dff3b4252d0f88067b23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/6a41d8fbd6b90052bc34dff3b4252d0f88067b23", + "reference": "6a41d8fbd6b90052bc34dff3b4252d0f88067b23", + "shasum": "" + }, + "require": { + "ext-json": "*", + "maxmind-db/reader": "~1.8", + "maxmind/web-service-common": "~0.8", + "php": ">=7.2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "^8.0 || ^9.0", + "squizlabs/php_codesniffer": "3.*" + }, + "time": "2022-08-05T20:32:58+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "GeoIp2\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Gregory J. Oschwald", + "email": "goschwald@maxmind.com", + "homepage": "https://www.maxmind.com/" + } + ], + "description": "MaxMind GeoIP2 PHP API", + "homepage": "https://github.com/maxmind/GeoIP2-php", + "keywords": [ + "IP", + "geoip", + "geoip2", + "geolocation", + "maxmind" + ], + "support": { + "issues": "https://github.com/maxmind/GeoIP2-php/issues", + "source": "https://github.com/maxmind/GeoIP2-php/tree/v2.13.0" + }, + "install-path": "../geoip2/geoip2" + }, { "name": "league/commonmark", "version": "2.8.0", @@ -273,6 +409,315 @@ ], "install-path": "../league/config" }, + { + "name": "league/uri", + "version": "7.8.1", + "version_normalized": "7.8.1.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.8.1", + "php": "^8.1", + "psr/http-factory": "^1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "time": "2026-03-15T20:22:25+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "install-path": "../league/uri" + }, + { + "name": "league/uri-interfaces", + "version": "7.8.1", + "version_normalized": "7.8.1.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "time": "2026-03-08T20:05:35+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "install-path": "../league/uri-interfaces" + }, + { + "name": "maxmind-db/reader", + "version": "v1.13.1", + "version_normalized": "1.13.1.0", + "source": { + "type": "git", + "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git", + "reference": "2194f58d0f024ce923e685cdf92af3daf9951908" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/2194f58d0f024ce923e685cdf92af3daf9951908", + "reference": "2194f58d0f024ce923e685cdf92af3daf9951908", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "conflict": { + "ext-maxminddb": "<1.11.1 || >=2.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.*", + "phpstan/phpstan": "*", + "phpunit/phpunit": ">=8.0.0,<10.0.0", + "squizlabs/php_codesniffer": "4.*" + }, + "suggest": { + "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder", + "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder", + "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups", + "maxmind-db/reader-ext": "C extension for significantly faster IP lookups (install via PIE: pie install maxmind-db/reader-ext)" + }, + "time": "2025-11-21T22:24:26+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "MaxMind\\Db\\": "src/MaxMind/Db" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Gregory J. Oschwald", + "email": "goschwald@maxmind.com", + "homepage": "https://www.maxmind.com/" + } + ], + "description": "MaxMind DB Reader API", + "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php", + "keywords": [ + "database", + "geoip", + "geoip2", + "geolocation", + "maxmind" + ], + "support": { + "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues", + "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.13.1" + }, + "install-path": "../maxmind-db/reader" + }, + { + "name": "maxmind/web-service-common", + "version": "v0.11.1", + "version_normalized": "0.11.1.0", + "source": { + "type": "git", + "url": "https://github.com/maxmind/web-service-common-php.git", + "reference": "c309236b5a5555b96cf560089ec3cead12d845d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/c309236b5a5555b96cf560089ec3cead12d845d2", + "reference": "c309236b5a5555b96cf560089ec3cead12d845d2", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.0.3", + "ext-curl": "*", + "ext-json": "*", + "php": ">=8.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.*", + "phpstan/phpstan": "*", + "phpunit/phpunit": "^10.0", + "squizlabs/php_codesniffer": "4.*" + }, + "time": "2026-01-13T17:56:03+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "MaxMind\\Exception\\": "src/Exception", + "MaxMind\\WebService\\": "src/WebService" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Gregory Oschwald", + "email": "goschwald@maxmind.com" + } + ], + "description": "Internal MaxMind Web Service API", + "homepage": "https://github.com/maxmind/web-service-common-php", + "support": { + "issues": "https://github.com/maxmind/web-service-common-php/issues", + "source": "https://github.com/maxmind/web-service-common-php/tree/v0.11.1" + }, + "install-path": "../maxmind/web-service-common" + }, { "name": "mustache/mustache", "version": "v3.0.0", @@ -668,6 +1113,120 @@ }, "install-path": "../psr/event-dispatcher" }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "time": "2024-04-15T12:06:14+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": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "install-path": "../psr/http-factory" + }, + { + "name": "psr/http-message", + "version": "2.0", + "version_normalized": "2.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "time": "2023-04-04T09:54:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.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": "https://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" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "install-path": "../psr/http-message" + }, { "name": "psr/log", "version": "3.0.2", @@ -721,6 +1280,148 @@ }, "install-path": "../psr/log" }, + { + "name": "scssphp/scssphp", + "version": "v2.1.0", + "version_normalized": "2.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/scssphp/scssphp.git", + "reference": "d8450c2baf5fb07d00374999d0ea51276974d1b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scssphp/scssphp/zipball/d8450c2baf5fb07d00374999d0ea51276974d1b6", + "reference": "d8450c2baf5fb07d00374999d0ea51276974d1b6", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-mbstring": "*", + "league/uri": "^7.6", + "league/uri-interfaces": "^7.6", + "php": ">=8.1", + "scssphp/source-span": "^1.1", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "require-dev": { + "jgthms/bulma": "~0.9.4", + "jiripudil/phpstan-sealed-classes": "^1.3", + "phpstan/phpstan": "^2.1.31", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpunit/phpunit": "^9.5.6", + "sass/sass-spec": "*", + "squizlabs/php_codesniffer": "^3.13", + "symfony/phpunit-bridge": "^7.3 || ^8.0", + "symfony/polyfill-php84": "^1.33", + "symfony/var-dumper": "^6.4 || ^7.3 || ^8.0", + "thoughtbot/bourbon": "^7.0", + "twbs/bootstrap": "^5.3", + "twbs/bootstrap4": "4.6.1", + "zurb/foundation": "~6.7.0" + }, + "time": "2025-11-21T17:27:59+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "ScssPhp\\ScssPhp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anthon Pang", + "email": "apang@softwaredevelopment.ca", + "homepage": "https://github.com/robocoder" + }, + { + "name": "Cédric Morin", + "email": "cedric@yterium.com", + "homepage": "https://github.com/Cerdic" + } + ], + "description": "scssphp is a compiler for SCSS written in PHP.", + "homepage": "https://scssphp.github.io/scssphp/", + "keywords": [ + "css", + "less", + "sass", + "scss", + "stylesheet" + ], + "support": { + "issues": "https://github.com/scssphp/scssphp/issues", + "source": "https://github.com/scssphp/scssphp/tree/v2.1.0" + }, + "install-path": "../scssphp/scssphp" + }, + { + "name": "scssphp/source-span", + "version": "v1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/scssphp/source-span.git", + "reference": "37d653206daf11da1ee60b333984101bc4c27ba2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scssphp/source-span/zipball/37d653206daf11da1ee60b333984101bc4c27ba2", + "reference": "37d653206daf11da1ee60b333984101bc4c27ba2", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/uri": "^7.6", + "league/uri-interfaces": "^7.6", + "php": ">=8.1" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpunit/phpunit": "^9.5.6", + "squizlabs/php_codesniffer": "~3.5", + "symfony/phpunit-bridge": "^6.4 || ^7.3 || ^8.0", + "symfony/var-dumper": "^6.4 || ^7.3 || ^8.0" + }, + "time": "2025-11-21T16:28:19+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "SourceSpan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christophe Coevoet", + "homepage": "https://github.com/stof" + } + ], + "description": "Provides a representation for source code locations and spans.", + "keywords": [ + "parsing" + ], + "support": { + "issues": "https://github.com/scssphp/source-span/issues", + "source": "https://github.com/scssphp/source-span/tree/v1.1.0" + }, + "install-path": "../scssphp/source-span" + }, { "name": "symfony/deprecation-contracts", "version": "v3.6.0", @@ -791,6 +1492,249 @@ ], "install-path": "../symfony/deprecation-contracts" }, + { + "name": "symfony/filesystem", + "version": "v8.1.2", + "version_normalized": "8.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "17856b7a222664a26a5ea1cb06ee0721c2438217" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/17856b7a222664a26a5ea1cb06ee0721c2438217", + "reference": "17856b7a222664a26a5ea1cb06ee0721c2438217", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^7.4|^8.0" + }, + "time": "2026-07-22T15:42:13+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "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": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v8.1.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/filesystem" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.37.0", + "version_normalized": "1.37.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "time": "2026-04-10T16:19:22+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "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" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-ctype" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "version_normalized": "1.31.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "time": "2024-09-09T11:45:10+00:00", + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "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" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "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-php80", "version": "v1.33.0", @@ -877,6 +1821,89 @@ } ], "install-path": "../symfony/polyfill-php80" + }, + { + "name": "twig/twig", + "version": "v3.28.0", + "version_normalized": "3.28.0.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "597c12ed286fb9d1701a36684ce6e0cbe28ebc8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/597c12ed286fb9d1701a36684ce6e0cbe28ebc8b", + "reference": "597c12ed286fb9d1701a36684ce6e0cbe28ebc8b", + "shasum": "" + }, + "require": { + "php": ">=8.1.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" + }, + "require-dev": { + "php-cs-fixer/shim": "^3.0@stable", + "phpstan/phpstan": "^2.0@stable", + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" + }, + "time": "2026-07-03T20:44:34+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.28.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "install-path": "../twig/twig" } ], "dev": true, diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index d970740..572a232 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => '__root__', 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => 'f685c2490ab18e80afa64695135087eeeec57804', + 'reference' => 'd453b8073f07afc24f2a03f94a982977263aa107', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,12 +13,21 @@ '__root__' => array( 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => 'f685c2490ab18e80afa64695135087eeeec57804', + 'reference' => 'd453b8073f07afc24f2a03f94a982977263aa107', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false, ), + 'composer/ca-bundle' => array( + 'pretty_version' => '1.5.13', + 'version' => '1.5.13.0', + 'reference' => 'c008272789979f709f7fcb32c2ecf1d2db5e84e5', + 'type' => 'library', + 'install_path' => __DIR__ . '/./ca-bundle', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'dflydev/dot-access-data' => array( 'pretty_version' => 'v3.0.3', 'version' => '3.0.3.0', @@ -28,6 +37,15 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'geoip2/geoip2' => array( + 'pretty_version' => 'v2.13.0', + 'version' => '2.13.0.0', + 'reference' => '6a41d8fbd6b90052bc34dff3b4252d0f88067b23', + 'type' => 'library', + 'install_path' => __DIR__ . '/../geoip2/geoip2', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'league/commonmark' => array( 'pretty_version' => '2.8.0', 'version' => '2.8.0.0', @@ -46,6 +64,42 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'league/uri' => array( + 'pretty_version' => '7.8.1', + 'version' => '7.8.1.0', + 'reference' => '08cf38e3924d4f56238125547b5720496fac8fd4', + 'type' => 'library', + 'install_path' => __DIR__ . '/../league/uri', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'league/uri-interfaces' => array( + 'pretty_version' => '7.8.1', + 'version' => '7.8.1.0', + 'reference' => '85d5c77c5d6d3af6c54db4a78246364908f3c928', + 'type' => 'library', + 'install_path' => __DIR__ . '/../league/uri-interfaces', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'maxmind-db/reader' => array( + 'pretty_version' => 'v1.13.1', + 'version' => '1.13.1.0', + 'reference' => '2194f58d0f024ce923e685cdf92af3daf9951908', + 'type' => 'library', + 'install_path' => __DIR__ . '/../maxmind-db/reader', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'maxmind/web-service-common' => array( + 'pretty_version' => 'v0.11.1', + 'version' => '0.11.1.0', + 'reference' => 'c309236b5a5555b96cf560089ec3cead12d845d2', + 'type' => 'library', + 'install_path' => __DIR__ . '/../maxmind/web-service-common', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'mustache/mustache' => array( 'pretty_version' => 'v3.0.0', 'version' => '3.0.0.0', @@ -100,6 +154,24 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'psr/http-factory' => array( + 'pretty_version' => '1.1.0', + 'version' => '1.1.0.0', + 'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/http-factory', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/http-message' => array( + 'pretty_version' => '2.0', + 'version' => '2.0.0.0', + 'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/http-message', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'psr/log' => array( 'pretty_version' => '3.0.2', 'version' => '3.0.2.0', @@ -109,6 +181,24 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'scssphp/scssphp' => array( + 'pretty_version' => 'v2.1.0', + 'version' => '2.1.0.0', + 'reference' => 'd8450c2baf5fb07d00374999d0ea51276974d1b6', + 'type' => 'library', + 'install_path' => __DIR__ . '/../scssphp/scssphp', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'scssphp/source-span' => array( + 'pretty_version' => 'v1.1.0', + 'version' => '1.1.0.0', + 'reference' => '37d653206daf11da1ee60b333984101bc4c27ba2', + 'type' => 'library', + 'install_path' => __DIR__ . '/../scssphp/source-span', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'symfony/deprecation-contracts' => array( 'pretty_version' => 'v3.6.0', 'version' => '3.6.0.0', @@ -118,6 +208,33 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'symfony/filesystem' => array( + 'pretty_version' => 'v8.1.2', + 'version' => '8.1.2.0', + 'reference' => '17856b7a222664a26a5ea1cb06ee0721c2438217', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/filesystem', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-ctype' => array( + 'pretty_version' => 'v1.37.0', + 'version' => '1.37.0.0', + 'reference' => '141046a8f9477948ff284fa65be2095baafb94f2', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-mbstring' => array( + 'pretty_version' => 'v1.31.0', + 'version' => '1.31.0.0', + 'reference' => '85181ba99b2345b0ef10ce42ecac37612d9fd341', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'symfony/polyfill-php80' => array( 'pretty_version' => 'v1.33.0', 'version' => '1.33.0.0', @@ -127,5 +244,14 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'twig/twig' => array( + 'pretty_version' => 'v3.28.0', + 'version' => '3.28.0.0', + 'reference' => '597c12ed286fb9d1701a36684ce6e0cbe28ebc8b', + 'type' => 'library', + 'install_path' => __DIR__ . '/../twig/twig', + 'aliases' => array(), + 'dev_requirement' => false, + ), ), ); diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php index 2beb149..4a0153c 100644 --- a/vendor/composer/platform_check.php +++ b/vendor/composer/platform_check.php @@ -4,8 +4,8 @@ $issues = array(); -if (!(PHP_VERSION_ID >= 80100)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 8.1.0". You are running ' . PHP_VERSION . '.'; +if (!(PHP_VERSION_ID >= 80401)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 8.4.1". You are running ' . PHP_VERSION . '.'; } if ($issues) { diff --git a/vendor/geoip2/geoip2/CHANGELOG.md b/vendor/geoip2/geoip2/CHANGELOG.md new file mode 100644 index 0000000..6af744f --- /dev/null +++ b/vendor/geoip2/geoip2/CHANGELOG.md @@ -0,0 +1,323 @@ +CHANGELOG +========= + +2.13.0 (2022-08-05) +------------------- + +* The model class names are no longer constructed by concatenating strings. + This change was made to improve support for tools like PHP-Scoper. + Reported by Andrew Mead. GitHub #194. +* Box 4.0.1 is now used to generate the `geoip2.phar` file. + +2.12.2 (2021-11-30) +------------------- + +* The `geoip2.phar` now works when included from another directory. + Reported by Eduardo Ruiz. GitHub #179. + +2.12.1 (2021-11-23) +------------------- + +* The `geoip2.phar` included in 2.12.0 would only work in CLI applications. + This was due to a change in Box 3.x. The Phar should now work in all + applications. This release only affects users of the Phar file. + +2.12.0 (2021-11-18) +------------------- + +* Support for mobile country code (MCC) and mobile network codes (MNC) was + added for the GeoIP2 ISP and Enterprise databases as well as the GeoIP2 + City and Insights web services. `$mobileCountryCode` and + `$mobileNetworkCode` properties were added to `GeoIp2\Model\Isp` + for the GeoIP2 ISP database and `GeoIp2\Record\Traits` for the Enterprise + database and the GeoIP2 City and Insights web services. We expect this data + to be available by late January, 2022. +* `geoip2.phar` is now generated with Box 3.x. + +2.11.0 (2020-10-01) +------------------- + +* IMPORTANT: PHP 7.2 or greater is now required. +* Added the `isResidentialProxy` property to `GeoIp2\Model\AnonymousIP` and + `GeoIp2\Record\Traits`. +* Additional type hints have been added. + +2.10.0 (2019-12-12) +------------------- + +* PHP 5.6 or greater is now required. +* The `network` property was added to `GeoIp2\Record\Traits`, + `GeoIp2\Model\AnonymousIp`, `GeoIp2\Model\Asn`, + `GeoIp2\Model\ConnectionType`, `Geoip2\Model\Domain`, + and `GeoIp2\Model\Isp`. This is a string in CIDR format representing the + largest network where all of the properties besides `ipAddress` have the + same value. +* Updated documentation of anonymizer properties - `isAnonymousVpn` + and `isHostingProvider` - to be more descriptive. +* The `userCount` property was added to `GeoIp2\Record\Traits`. This is an + integer which indicates the estimated number of users sharing the + IP/network during the past 24 hours. This output is available from GeoIP2 + Precision Insights. +* The `staticIpScore` property was added to `GeoIp2\Record\Traits`. This is + a float which indicates how static or dynamic an IP address is. This + output is available from GeoIP2 Precision Insights. + +2.9.0 (2018-04-10) +------------------ + +* Refer to account IDs using the terminology "account" rather than "user". + +2.8.0 (2018-01-18) +------------------ + +* The `isInEuropeanUnion` property was added to `GeoIp2\Record\Country` + and `GeoIp2\Record\RepresentedCountry`. This property is `true` if the + country is a member state of the European Union. + +2.7.0 (2017-10-27) +------------------ + +* The following new anonymizer properties were added to `GeoIp2\Record\Traits` + for use with GeoIP2 Precision Insights: `isAnonymous`, `isAnonymousVpn`, + `isHostingProvider`, `isPublicProxy`, and `isTorExitNode`. + +2.6.0 (2017-07-10) +----------------- + +* Code clean-up and tidying. +* Set minimum required PHP version to 5.4 in `composer.json`. Previously, + 5.3 would work but was not tested. Now 5.4 is hard minimum version. + +2.5.0 (2017-05-08) +------------------ + +* Support for PHP 5.3 was dropped. +* Added support for GeoLite2 ASN database. + +2.4.5 (2017-01-31) +------------------ + +* Additional error checking on the data returned from `MaxMind\Db\Reader` + was added to help detect corrupt databases. GitHub #83. + +2.4.4 (2016-10-11) +------------------ + +* `isset()` on `mostSpecificSubdivision` attribute now returns the + correct value. Reported by Juan Francisco Giordana. GitHub #81. + +2.4.3 (2016-10-11) +------------------ + +* `isset()` on `name` attribute now returns the correct value. Reported by + Juan Francisco Giordana. GitHub #79. + +2.4.2 (2016-08-17) +------------------ + +* Updated documentation to clarify what the accuracy radius refers to. +* Upgraded `maxmind/web-service-common` to 0.3.0. This version uses + `composer/ca-bundle` rather than our own CA bundle. GitHub #75. +* Improved PHP documentation generation. + +2.4.1 (2016-06-10) +------------------ + +* Corrected type annotations in documentation. GitHub #66. +* Updated documentation to reflect that the accuracy radius is now included + in City. +* Upgraded web service client, which supports setting a proxy. GitHub #59. + +2.4.0 (2016-04-15) +------------------ + +* Added support for the GeoIP2 Enterprise database. + +2.3.3 (2015-09-24) +------------------ + +* Corrected case on `JsonSerializable` interface. Reported by Axel Etcheverry. + GitHub #56. + +2.3.2 (2015-09-23) +------------------ + +* `JsonSerializable` compatibility interface was moved to `GeoIp2\Compat` + rather than the global namespace to prevent autoloading issues. Reported by + Tomas Buteler. GitHub #54. +* Missing documentation for the `$postal` property was added to the + `GeoIp2\Model\City` class. Fix by Roy Sindre Norangshol. GitHub #51. +* In the Phar distribution, source files for this module no longer have their + documentation stripped, allowing IDE introspection to work properly. + Reported by Dominic Black. GitHub #52. + +2.3.1 (2015-06-30) +------------------ + +* Updated `maxmind/web-service-common` to version with fixes for PHP 5.3 and + 5.4. + +2.3.0 (2015-06-29) +------------------ + +* Support for demographics fields `averageIncome` and `populationDensity` in + the `Location` record, returned by the Insights endpoint. +* The `isAnonymousProxy` and `isSatelliteProvider` properties on + `GeoIP2\Record\Traits` have been deprecated. Please use our [GeoIP2 + Anonymous IP database](https://www.maxmind.com/en/geoip2-anonymous-ip-database) + to determine whether an IP address is used by an anonymizing service. + +2.2.0-beta1 (2015-06-09) +------------------------ + +* Typo fix in documentation. + +2.2.0-alpha2 (2015-06-01) +------------------------- + +* `maxmind-ws/web-service-common` was renamed to `maxmind/web-service-common`. + +2.2.0-alpha1 (2015-05-22) +------------------------- + +* The library no longer uses Guzzle and instead uses curl directly. +* Support for `timeout` and `connectTimout` were added to the `$options` array + passed to the `GeoIp2\WebService\Client` constructor. Pull request by Will + Bradley. GitHub #36. + +2.1.1 (2014-12-03) +------------------ + +* The 2.1.0 Phar builds included a shebang line, causing issues when loading + it as a library. This has been corrected. GitHub #33. + +2.1.0 (2014-10-29) +------------------ + +* Update ApiGen dependency to version that isn't broken on case sensitive + file systems. +* Added support for the GeoIP2 Anonymous IP database. The + `GeoIP2\Database\Reader` class now has an `anonymousIp` method which returns + a `GeoIP2\Model\AnonymousIp` object. +* Boolean attributes like those in the `GeoIP2\Record\Traits` class now return + `false` instead of `null` when they were not true. + +2.0.0 (2014-09-22) +------------------ + +* First production release. + +0.9.0 (2014-09-15) +------------------ + +* IMPORTANT: The deprecated `omni()` and `cityIspOrg()` methods have been + removed from `GeoIp2\WebService\Client`. + +0.8.1 (2014-09-12) +------------------ + +* The check added to the `GeoIP2\Database\Reader` lookup methods in 0.8.0 did + not work with the GeoIP2 City Database Subset by Continent with World + Countries. This has been fixed. Fixes GitHub issue #23. + +0.8.0 (2014-09-10) +------------------ + +* The `GeoIp2\Database\Reader` lookup methods (e.g., `city()`, `isp()`) now + throw a `BadMethodCallException` if they are used with a database that + does not match the method. In particular, doing a `city()` lookup on a + GeoIP2 Country database will result in an exception, and vice versa. +* A `metadata()` method has been added to the `GeoIP2\Database\Reader` class. + This returns a `MaxMind\Db\Reader\Metadata` class with information about the + database. +* The name attribute was missing from the RepresentedCountry class. + +0.7.0 (2014-07-22) +------------------ + +* The web service client API has been updated for the v2.1 release of the web + service. In particular, the `cityIspOrg` and `omni` methods on + `GeoIp2\WebService\Client` should be considered deprecated. The `city` + method now provides all of the data formerly provided by `cityIspOrg`, and + the `omni` method has been replaced by the `insights` method. +* Support was added for GeoIP2 Connection Type, Domain and ISP databases. + + +0.6.3 (2014-05-12) +------------------ + +* With the previous Phar builds, some users received `phar error: invalid url + or non-existent phar` errors. The correct alias is now used for the Phar, + and this should no longer be an issue. + +0.6.2 (2014-05-08) +------------------ + +* The Phar build was broken with Guzzle 3.9.0+. This has been fixed. + +0.6.1 (2014-05-01) +------------------ + +* This API now officially supports HHVM. +* The `maxmind-db/reader` dependency was updated to a version that does not + require BC Math. +* The Composer compatibility autoload rules are now targeted more narrowly. +* A `box.json` file is included to build a Phar package. + +0.6.0 (2014-02-19) +------------------ + +* This API is now licensed under the Apache License, Version 2.0. +* Model and record classes now implement `JsonSerializable`. +* `isset` now works with model and record classes. + +0.5.0 (2013-10-21) +------------------ + +* Renamed $languages constructor parameters to $locales for both the Client + and Reader classes. +* Documentation and code clean-up (Ben Morel). +* Added the interface `GeoIp2\ProviderInterface`, which is implemented by both + `\GeoIp2\Database\Reader` and `\GeoIp2\WebService\Client`. + +0.4.0 (2013-07-16) +------------------ + +* This is the first release with the GeoIP2 database reader. Please see the + `README.md` file and the `\GeoIp2\Database\Reader` class. +* The general exception classes were replaced with specific exception classes + representing particular types of errors, such as an authentication error. + +0.3.0 (2013-07-12) +------------------ + +* In namespaces and class names, "GeoIP2" was renamed to "GeoIp2" to improve + consistency. + +0.2.1 (2013-06-10) +------------------ + +* First official beta release. +* Documentation updates and corrections. + +0.2.0 (2013-05-29) +------------------ + +* `GenericException` was renamed to `GeoIP2Exception`. +* We now support more languages. The new languages are de, es, fr, and pt-BR. +* The REST API now returns a record with data about your account. There is + a new `GeoIP\Records\MaxMind` class for this data. +* The `continentCode` attribute on `Continent` was renamed to `code`. +* Documentation updates. + +0.1.1 (2013-05-14) +------------------ + +* Updated Guzzle version requirement. +* Fixed Composer example in README.md. + + +0.1.0 (2013-05-13) +------------------ + +* Initial release. diff --git a/vendor/geoip2/geoip2/LICENSE b/vendor/geoip2/geoip2/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/vendor/geoip2/geoip2/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/geoip2/geoip2/README.md b/vendor/geoip2/geoip2/README.md new file mode 100644 index 0000000..ea08e27 --- /dev/null +++ b/vendor/geoip2/geoip2/README.md @@ -0,0 +1,442 @@ +# GeoIP2 PHP API # + +## Description ## + +This package provides an API for the GeoIP2 and GeoLite2 +[web services](https://dev.maxmind.com/geoip/docs/web-services?lang=en) and +[databases](https://dev.maxmind.com/geoip/docs/databases?lang=en). + +## Install via Composer ## + +We recommend installing this package with [Composer](https://getcomposer.org/). + +### Download Composer ### + +To download Composer, run in the root directory of your project: + +```bash +curl -sS https://getcomposer.org/installer | php +``` + +You should now have the file `composer.phar` in your project directory. + +### Install Dependencies ### + +Run in your project root: + +```sh +php composer.phar require geoip2/geoip2:~2.0 +``` + +You should now have the files `composer.json` and `composer.lock` as well as +the directory `vendor` in your project directory. If you use a version control +system, `composer.json` should be added to it. + +### Require Autoloader ### + +After installing the dependencies, you need to require the Composer autoloader +from your code: + +```php +require 'vendor/autoload.php'; +``` + +## Install via Phar ## + +Although we strongly recommend using Composer, we also provide a +[phar archive](https://php.net/manual/en/book.phar.php) containing most of the +dependencies for GeoIP2. Our latest phar archive is available on +[our releases page](https://github.com/maxmind/GeoIP2-php/releases). + +### Install Dependencies ### + +In order to use the phar archive, you must have the PHP +[Phar extension](https://php.net/manual/en/book.phar.php) installed and +enabled. + +If you will be making web service requests, you must have the PHP +[cURL extension](https://php.net/manual/en/book.curl.php) +installed to use this archive. For Debian based distributions, this can +typically be found in the the `php-curl` package. For other operating +systems, please consult the relevant documentation. After installing the +extension you may need to restart your web server. + +If you are missing this extension, you will see errors like the following: + +``` +PHP Fatal error: Uncaught Error: Call to undefined function MaxMind\WebService\curl_version() +``` + +### Require Package ### + +To use the archive, just require it from your script: + +```php +require 'geoip2.phar'; +``` + +## Optional C Extension ## + +The [MaxMind DB API](https://github.com/maxmind/MaxMind-DB-Reader-php) +includes an optional C extension that you may install to dramatically increase +the performance of lookups in GeoIP2 or GeoLite2 databases. To install, please +follow the instructions included with that API. + +The extension has no effect on web-service lookups. + +## IP Geolocation Usage ## + +IP geolocation is inherently imprecise. Locations are often near the center of +the population. Any location provided by a GeoIP2 database or web service +should not be used to identify a particular address or household. + +## Database Reader ## + +### Usage ### + +To use this API, you must create a new `\GeoIp2\Database\Reader` object with +the path to the database file as the first argument to the constructor. You +may then call the method corresponding to the database you are using. + +If the lookup succeeds, the method call will return a model class for the +record in the database. This model in turn contains multiple container +classes for the different parts of the data such as the city in which the +IP address is located. + +If the record is not found, a `\GeoIp2\Exception\AddressNotFoundException` +is thrown. If the database is invalid or corrupt, a +`\MaxMind\Db\InvalidDatabaseException` will be thrown. + +See the API documentation for more details. + +### City Example ### + +```php +city('128.101.101.101'); + +print($record->country->isoCode . "\n"); // 'US' +print($record->country->name . "\n"); // 'United States' +print($record->country->names['zh-CN'] . "\n"); // '美国' + +print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota' +print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN' + +print($record->city->name . "\n"); // 'Minneapolis' + +print($record->postal->code . "\n"); // '55455' + +print($record->location->latitude . "\n"); // 44.9733 +print($record->location->longitude . "\n"); // -93.2323 + +print($record->traits->network . "\n"); // '128.101.101.101/32' + +``` + +### Anonymous IP Example ### + +```php +anonymousIp('128.101.101.101'); + +if ($record->isAnonymous) { print "anon\n"; } +print($record->ipAddress . "\n"); // '128.101.101.101' +print($record->network . "\n"); // '128.101.101.101/32' + +``` + +### Connection-Type Example ### + +```php +connectionType('128.101.101.101'); + +print($record->connectionType . "\n"); // 'Corporate' +print($record->ipAddress . "\n"); // '128.101.101.101' +print($record->network . "\n"); // '128.101.101.101/32' + +``` + +### Domain Example ### + +```php +domain('128.101.101.101'); + +print($record->domain . "\n"); // 'umn.edu' +print($record->ipAddress . "\n"); // '128.101.101.101' +print($record->network . "\n"); // '128.101.101.101/32' + +``` + +### Enterprise Example ### + +```php +enterprise method to do a lookup in the Enterprise database +$record = $reader->enterprise('128.101.101.101'); + +print($record->country->confidence . "\n"); // 99 +print($record->country->isoCode . "\n"); // 'US' +print($record->country->name . "\n"); // 'United States' +print($record->country->names['zh-CN'] . "\n"); // '美国' + +print($record->mostSpecificSubdivision->confidence . "\n"); // 77 +print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota' +print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN' + +print($record->city->confidence . "\n"); // 60 +print($record->city->name . "\n"); // 'Minneapolis' + +print($record->postal->code . "\n"); // '55455' + +print($record->location->accuracyRadius . "\n"); // 50 +print($record->location->latitude . "\n"); // 44.9733 +print($record->location->longitude . "\n"); // -93.2323 + +print($record->traits->network . "\n"); // '128.101.101.101/32' + +``` + +### ISP Example ### + +```php +isp('128.101.101.101'); + +print($record->autonomousSystemNumber . "\n"); // 217 +print($record->autonomousSystemOrganization . "\n"); // 'University of Minnesota' +print($record->isp . "\n"); // 'University of Minnesota' +print($record->organization . "\n"); // 'University of Minnesota' + +print($record->ipAddress . "\n"); // '128.101.101.101' +print($record->network . "\n"); // '128.101.101.101/32' + +``` + +## Database Updates ## + +You can keep your databases up to date with our +[GeoIP Update program](https://github.com/maxmind/geoipupdate/releases). +[Learn more about GeoIP Update on our developer +portal.](https://dev.maxmind.com/geoip/updating-databases?lang=en) + +There is also a third-party tool for updating databases using PHP and +Composer. MaxMind does not offer support for this tool or maintain it. +[Learn more about the Geoip2 Update tool for PHP and Composer on its +GitHub page.](https://github.com/tronovav/geoip2-update) + +## Web Service Client ## + +### Usage ### + +To use this API, you must create a new `\GeoIp2\WebService\Client` +object with your `$accountId` and `$licenseKey`: + +```php +$client = new Client(42, 'abcdef123456'); +``` + +You may also call the constructor with additional arguments. The third argument +specifies the language preferences when using the `->name` method on the model +classes that this client creates. The fourth argument is additional options +such as `host` and `timeout`. + +For instance, to call the GeoLite2 web service instead of the GeoIP2 web +service: + +```php +$client = new Client(42, 'abcdef123456', ['en'], ['host' => 'geolite.info']); +``` + +After creating the client, you may now call the method corresponding to a +specific endpoint with the IP address to look up, e.g.: + +```php +$record = $client->city('128.101.101.101'); +``` + +If the request succeeds, the method call will return a model class for the +endpoint you called. This model in turn contains multiple record classes, each +of which represents part of the data returned by the web service. + +If there is an error, a structured exception is thrown. + +See the API documentation for more details. + +### Example ### + +```php +city('128.101.101.101'); + +print($record->country->isoCode . "\n"); // 'US' +print($record->country->name . "\n"); // 'United States' +print($record->country->names['zh-CN'] . "\n"); // '美国' + +print($record->mostSpecificSubdivision->name . "\n"); // 'Minnesota' +print($record->mostSpecificSubdivision->isoCode . "\n"); // 'MN' + +print($record->city->name . "\n"); // 'Minneapolis' + +print($record->postal->code . "\n"); // '55455' + +print($record->location->latitude . "\n"); // 44.9733 +print($record->location->longitude . "\n"); // -93.2323 + +print($record->traits->network . "\n"); // '128.101.101.101/32' + +``` + +## Values to use for Database or Array Keys ## + +**We strongly discourage you from using a value from any `names` property as +a key in a database or array.** + +These names may change between releases. Instead we recommend using one of the +following: + +* `GeoIp2\Record\City` - `$city->geonameId` +* `GeoIp2\Record\Continent` - `$continent->code` or `$continent->geonameId` +* `GeoIp2\Record\Country` and `GeoIp2\Record\RepresentedCountry` - + `$country->isoCode` or `$country->geonameId` +* `GeoIp2\Record\Subdivision` - `$subdivision->isoCode` or `$subdivision->geonameId` + +### What data is returned? ### + +While many of the end points return the same basic records, the attributes +which can be populated vary between end points. In addition, while an end +point may offer a particular piece of data, MaxMind does not always have every +piece of data for any given IP address. + +Because of these factors, it is possible for any end point to return a record +where some or all of the attributes are unpopulated. + +See the +[GeoIP2 web service docs](https://dev.maxmind.com/geoip/docs/web-services?lang=en) +for details on what data each end point may return. + +The only piece of data which is always returned is the `ipAddress` +attribute in the `GeoIp2\Record\Traits` record. + +## Integration with GeoNames ## + +[GeoNames](https://www.geonames.org/) offers web services and downloadable +databases with data on geographical features around the world, including +populated places. They offer both free and paid premium data. Each +feature is unique identified by a `geonameId`, which is an integer. + +Many of the records returned by the GeoIP2 web services and databases +include a `geonameId` property. This is the ID of a geographical feature +(city, region, country, etc.) in the GeoNames database. + +Some of the data that MaxMind provides is also sourced from GeoNames. We +source things like place names, ISO codes, and other similar data from +the GeoNames premium data set. + +## Reporting data problems ## + +If the problem you find is that an IP address is incorrectly mapped, +please +[submit your correction to MaxMind](https://www.maxmind.com/en/correction). + +If you find some other sort of mistake, like an incorrect spelling, +please check the [GeoNames site](https://www.geonames.org/) first. Once +you've searched for a place and found it on the GeoNames map view, there +are a number of links you can use to correct data ("move", "edit", +"alternate names", etc.). Once the correction is part of the GeoNames +data set, it will be automatically incorporated into future MaxMind +releases. + +If you are a paying MaxMind customer and you're not sure where to submit +a correction, please +[contact MaxMind support](https://www.maxmind.com/en/support) for help. + +## Other Support ## + +Please report all issues with this code using the +[GitHub issue tracker](https://github.com/maxmind/GeoIP2-php/issues). + +If you are having an issue with a MaxMind service that is not specific +to the client API, please see +[our support page](https://www.maxmind.com/en/support). + +## Requirements ## + +This library requires PHP 7.2 or greater. + +This library also relies on the [MaxMind DB Reader](https://github.com/maxmind/MaxMind-DB-Reader-php). + +## Contributing ## + +Patches and pull requests are encouraged. All code should follow the PSR-2 +style guidelines. Please include unit tests whenever possible. You may obtain +the test data for the maxmind-db folder by running `git submodule update +--init --recursive` or adding `--recursive` to your initial clone, or from +https://github.com/maxmind/MaxMind-DB + +## Versioning ## + +The GeoIP2 PHP API uses [Semantic Versioning](https://semver.org/). + +## Copyright and License ## + +This software is Copyright (c) 2013-2020 by MaxMind, Inc. + +This is free software, licensed under the Apache License, Version 2.0. diff --git a/vendor/geoip2/geoip2/composer.json b/vendor/geoip2/geoip2/composer.json new file mode 100644 index 0000000..e29513b --- /dev/null +++ b/vendor/geoip2/geoip2/composer.json @@ -0,0 +1,32 @@ +{ + "name": "geoip2/geoip2", + "description": "MaxMind GeoIP2 PHP API", + "keywords": ["geoip", "geoip2", "geolocation", "ip", "maxmind"], + "homepage": "https://github.com/maxmind/GeoIP2-php", + "type": "library", + "license": "Apache-2.0", + "authors": [ + { + "name": "Gregory J. Oschwald", + "email": "goschwald@maxmind.com", + "homepage": "https://www.maxmind.com/" + } + ], + "require": { + "maxmind-db/reader": "~1.8", + "maxmind/web-service-common": "~0.8", + "php": ">=7.2", + "ext-json": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.*", + "phpunit/phpunit": "^8.0 || ^9.0", + "squizlabs/php_codesniffer": "3.*", + "phpstan/phpstan": "*" + }, + "autoload": { + "psr-4": { + "GeoIp2\\": "src" + } + } +} diff --git a/vendor/geoip2/geoip2/examples/benchmark.php b/vendor/geoip2/geoip2/examples/benchmark.php new file mode 100644 index 0000000..a735a78 --- /dev/null +++ b/vendor/geoip2/geoip2/examples/benchmark.php @@ -0,0 +1,26 @@ +city($ip); + } catch (\GeoIp2\Exception\AddressNotFoundException $e) { + } + if ($i % 10000 === 0) { + echo $i . ' ' . $ip . "\n"; + } +} +$endTime = microtime(true); + +$duration = $endTime - $startTime; +echo 'Requests per second: ' . $count / $duration . "\n"; diff --git a/vendor/geoip2/geoip2/src/Database/Reader.php b/vendor/geoip2/geoip2/src/Database/Reader.php new file mode 100644 index 0000000..4dabc5d --- /dev/null +++ b/vendor/geoip2/geoip2/src/Database/Reader.php @@ -0,0 +1,299 @@ + + */ + private $locales; + + /** + * Constructor. + * + * @param string $filename the path to the GeoIP2 database file + * @param array $locales list of locale codes to use in name property + * from most preferred to least preferred + * + * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database + * is corrupt or invalid + */ + public function __construct( + string $filename, + array $locales = ['en'] + ) { + $this->dbReader = new DbReader($filename); + $this->dbType = $this->dbReader->metadata()->databaseType; + $this->locales = $locales; + } + + /** + * This method returns a GeoIP2 City model. + * + * @param string $ipAddress an IPv4 or IPv6 address as a string + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address is + * not in the database + * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database + * is corrupt or invalid + */ + public function city(string $ipAddress): City + { + // @phpstan-ignore-next-line + return $this->modelFor(City::class, 'City', $ipAddress); + } + + /** + * This method returns a GeoIP2 Country model. + * + * @param string $ipAddress an IPv4 or IPv6 address as a string + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address is + * not in the database + * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database + * is corrupt or invalid + */ + public function country(string $ipAddress): Country + { + // @phpstan-ignore-next-line + return $this->modelFor(Country::class, 'Country', $ipAddress); + } + + /** + * This method returns a GeoIP2 Anonymous IP model. + * + * @param string $ipAddress an IPv4 or IPv6 address as a string + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address is + * not in the database + * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database + * is corrupt or invalid + */ + public function anonymousIp(string $ipAddress): AnonymousIp + { + // @phpstan-ignore-next-line + return $this->flatModelFor( + AnonymousIp::class, + 'GeoIP2-Anonymous-IP', + $ipAddress + ); + } + + /** + * This method returns a GeoLite2 ASN model. + * + * @param string $ipAddress an IPv4 or IPv6 address as a string + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address is + * not in the database + * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database + * is corrupt or invalid + */ + public function asn(string $ipAddress): Asn + { + // @phpstan-ignore-next-line + return $this->flatModelFor( + Asn::class, + 'GeoLite2-ASN', + $ipAddress + ); + } + + /** + * This method returns a GeoIP2 Connection Type model. + * + * @param string $ipAddress an IPv4 or IPv6 address as a string + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address is + * not in the database + * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database + * is corrupt or invalid + */ + public function connectionType(string $ipAddress): ConnectionType + { + // @phpstan-ignore-next-line + return $this->flatModelFor( + ConnectionType::class, + 'GeoIP2-Connection-Type', + $ipAddress + ); + } + + /** + * This method returns a GeoIP2 Domain model. + * + * @param string $ipAddress an IPv4 or IPv6 address as a string + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address is + * not in the database + * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database + * is corrupt or invalid + */ + public function domain(string $ipAddress): Domain + { + // @phpstan-ignore-next-line + return $this->flatModelFor( + Domain::class, + 'GeoIP2-Domain', + $ipAddress + ); + } + + /** + * This method returns a GeoIP2 Enterprise model. + * + * @param string $ipAddress an IPv4 or IPv6 address as a string + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address is + * not in the database + * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database + * is corrupt or invalid + */ + public function enterprise(string $ipAddress): Enterprise + { + // @phpstan-ignore-next-line + return $this->modelFor(Enterprise::class, 'Enterprise', $ipAddress); + } + + /** + * This method returns a GeoIP2 ISP model. + * + * @param string $ipAddress an IPv4 or IPv6 address as a string + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address is + * not in the database + * @throws \MaxMind\Db\Reader\InvalidDatabaseException if the database + * is corrupt or invalid + */ + public function isp(string $ipAddress): Isp + { + // @phpstan-ignore-next-line + return $this->flatModelFor( + Isp::class, + 'GeoIP2-ISP', + $ipAddress + ); + } + + private function modelFor(string $class, string $type, string $ipAddress): AbstractModel + { + [$record, $prefixLen] = $this->getRecord($class, $type, $ipAddress); + + $record['traits']['ip_address'] = $ipAddress; + $record['traits']['prefix_len'] = $prefixLen; + + return new $class($record, $this->locales); + } + + private function flatModelFor(string $class, string $type, string $ipAddress): AbstractModel + { + [$record, $prefixLen] = $this->getRecord($class, $type, $ipAddress); + + $record['ip_address'] = $ipAddress; + $record['prefix_len'] = $prefixLen; + + return new $class($record); + } + + private function getRecord(string $class, string $type, string $ipAddress): array + { + if (strpos($this->dbType, $type) === false) { + $method = lcfirst((new \ReflectionClass($class))->getShortName()); + + throw new \BadMethodCallException( + "The $method method cannot be used to open a {$this->dbType} database" + ); + } + [$record, $prefixLen] = $this->dbReader->getWithPrefixLen($ipAddress); + if ($record === null) { + throw new AddressNotFoundException( + "The address $ipAddress is not in the database." + ); + } + if (!\is_array($record)) { + // This can happen on corrupt databases. Generally, + // MaxMind\Db\Reader will throw a + // MaxMind\Db\Reader\InvalidDatabaseException, but occasionally + // the lookup may result in a record that looks valid but is not + // an array. This mostly happens when the user is ignoring all + // exceptions and the more frequent InvalidDatabaseException + // exceptions go unnoticed. + throw new InvalidDatabaseException( + "Expected an array when looking up $ipAddress but received: " + . \gettype($record) + ); + } + + return [$record, $prefixLen]; + } + + /** + * @throws \InvalidArgumentException if arguments are passed to the method + * @throws \BadMethodCallException if the database has been closed + * + * @return \MaxMind\Db\Reader\Metadata object for the database + */ + public function metadata(): DbReader\Metadata + { + return $this->dbReader->metadata(); + } + + /** + * Closes the GeoIP2 database and returns the resources to the system. + */ + public function close(): void + { + $this->dbReader->close(); + } +} diff --git a/vendor/geoip2/geoip2/src/Exception/AddressNotFoundException.php b/vendor/geoip2/geoip2/src/Exception/AddressNotFoundException.php new file mode 100644 index 0000000..628fb06 --- /dev/null +++ b/vendor/geoip2/geoip2/src/Exception/AddressNotFoundException.php @@ -0,0 +1,12 @@ +uri = $uri; + parent::__construct($message, $httpStatus, $previous); + } +} diff --git a/vendor/geoip2/geoip2/src/Exception/InvalidRequestException.php b/vendor/geoip2/geoip2/src/Exception/InvalidRequestException.php new file mode 100644 index 0000000..925b68d --- /dev/null +++ b/vendor/geoip2/geoip2/src/Exception/InvalidRequestException.php @@ -0,0 +1,30 @@ +error = $error; + parent::__construct($message, $httpStatus, $uri, $previous); + } +} diff --git a/vendor/geoip2/geoip2/src/Exception/OutOfQueriesException.php b/vendor/geoip2/geoip2/src/Exception/OutOfQueriesException.php new file mode 100644 index 0000000..9734c8c --- /dev/null +++ b/vendor/geoip2/geoip2/src/Exception/OutOfQueriesException.php @@ -0,0 +1,12 @@ + + */ + protected $raw; + + /** + * @ignore + */ + public function __construct(array $raw) + { + $this->raw = $raw; + } + + /** + * @ignore + * + * @return mixed + */ + protected function get(string $field) + { + if (isset($this->raw[$field])) { + return $this->raw[$field]; + } + if (preg_match('/^is_/', $field)) { + return false; + } + + return null; + } + + /** + * @ignore + * + * @return mixed + */ + public function __get(string $attr) + { + if ($attr !== 'instance' && property_exists($this, $attr)) { + return $this->{$attr}; + } + + throw new \RuntimeException("Unknown attribute: $attr"); + } + + /** + * @ignore + */ + public function __isset(string $attr): bool + { + return $attr !== 'instance' && isset($this->{$attr}); + } + + public function jsonSerialize(): array + { + return $this->raw; + } +} diff --git a/vendor/geoip2/geoip2/src/Model/AnonymousIp.php b/vendor/geoip2/geoip2/src/Model/AnonymousIp.php new file mode 100644 index 0000000..5586bd0 --- /dev/null +++ b/vendor/geoip2/geoip2/src/Model/AnonymousIp.php @@ -0,0 +1,91 @@ +isAnonymous = $this->get('is_anonymous'); + $this->isAnonymousVpn = $this->get('is_anonymous_vpn'); + $this->isHostingProvider = $this->get('is_hosting_provider'); + $this->isPublicProxy = $this->get('is_public_proxy'); + $this->isResidentialProxy = $this->get('is_residential_proxy'); + $this->isTorExitNode = $this->get('is_tor_exit_node'); + $ipAddress = $this->get('ip_address'); + $this->ipAddress = $ipAddress; + $this->network = Util::cidr($ipAddress, $this->get('prefix_len')); + } +} diff --git a/vendor/geoip2/geoip2/src/Model/Asn.php b/vendor/geoip2/geoip2/src/Model/Asn.php new file mode 100644 index 0000000..f05177e --- /dev/null +++ b/vendor/geoip2/geoip2/src/Model/Asn.php @@ -0,0 +1,58 @@ +autonomousSystemNumber = $this->get('autonomous_system_number'); + $this->autonomousSystemOrganization = + $this->get('autonomous_system_organization'); + $ipAddress = $this->get('ip_address'); + $this->ipAddress = $ipAddress; + $this->network = Util::cidr($ipAddress, $this->get('prefix_len')); + } +} diff --git a/vendor/geoip2/geoip2/src/Model/City.php b/vendor/geoip2/geoip2/src/Model/City.php new file mode 100644 index 0000000..b2e81dc --- /dev/null +++ b/vendor/geoip2/geoip2/src/Model/City.php @@ -0,0 +1,123 @@ + + */ + protected $subdivisions = []; + + /** + * @ignore + */ + public function __construct(array $raw, array $locales = ['en']) + { + parent::__construct($raw, $locales); + + $this->city = new \GeoIp2\Record\City($this->get('city'), $locales); + $this->location = new \GeoIp2\Record\Location($this->get('location')); + $this->postal = new \GeoIp2\Record\Postal($this->get('postal')); + + $this->createSubdivisions($raw, $locales); + } + + private function createSubdivisions(array $raw, array $locales): void + { + if (!isset($raw['subdivisions'])) { + return; + } + + foreach ($raw['subdivisions'] as $sub) { + $this->subdivisions[] = + new \GeoIp2\Record\Subdivision($sub, $locales) + ; + } + } + + /** + * @ignore + * + * @return mixed + */ + public function __get(string $attr) + { + if ($attr === 'mostSpecificSubdivision') { + return $this->{$attr}(); + } + + return parent::__get($attr); + } + + /** + * @ignore + */ + public function __isset(string $attr): bool + { + if ($attr === 'mostSpecificSubdivision') { + // We always return a mostSpecificSubdivision, even if it is the + // empty subdivision + return true; + } + + return parent::__isset($attr); + } + + private function mostSpecificSubdivision(): \GeoIp2\Record\Subdivision + { + return empty($this->subdivisions) ? + new \GeoIp2\Record\Subdivision([], $this->locales) : + end($this->subdivisions); + } +} diff --git a/vendor/geoip2/geoip2/src/Model/ConnectionType.php b/vendor/geoip2/geoip2/src/Model/ConnectionType.php new file mode 100644 index 0000000..36d4529 --- /dev/null +++ b/vendor/geoip2/geoip2/src/Model/ConnectionType.php @@ -0,0 +1,50 @@ +connectionType = $this->get('connection_type'); + $ipAddress = $this->get('ip_address'); + $this->ipAddress = $ipAddress; + $this->network = Util::cidr($ipAddress, $this->get('prefix_len')); + } +} diff --git a/vendor/geoip2/geoip2/src/Model/Country.php b/vendor/geoip2/geoip2/src/Model/Country.php new file mode 100644 index 0000000..fdffc63 --- /dev/null +++ b/vendor/geoip2/geoip2/src/Model/Country.php @@ -0,0 +1,96 @@ + + */ + protected $locales; + + /** + * @var \GeoIp2\Record\MaxMind + */ + protected $maxmind; + + /** + * @var \GeoIp2\Record\Country + */ + protected $registeredCountry; + + /** + * @var \GeoIp2\Record\RepresentedCountry + */ + protected $representedCountry; + + /** + * @var \GeoIp2\Record\Traits + */ + protected $traits; + + /** + * @ignore + */ + public function __construct(array $raw, array $locales = ['en']) + { + parent::__construct($raw); + + $this->continent = new \GeoIp2\Record\Continent( + $this->get('continent'), + $locales + ); + $this->country = new \GeoIp2\Record\Country( + $this->get('country'), + $locales + ); + $this->maxmind = new \GeoIp2\Record\MaxMind($this->get('maxmind')); + $this->registeredCountry = new \GeoIp2\Record\Country( + $this->get('registered_country'), + $locales + ); + $this->representedCountry = new \GeoIp2\Record\RepresentedCountry( + $this->get('represented_country'), + $locales + ); + $this->traits = new \GeoIp2\Record\Traits($this->get('traits')); + + $this->locales = $locales; + } +} diff --git a/vendor/geoip2/geoip2/src/Model/Domain.php b/vendor/geoip2/geoip2/src/Model/Domain.php new file mode 100644 index 0000000..067a507 --- /dev/null +++ b/vendor/geoip2/geoip2/src/Model/Domain.php @@ -0,0 +1,50 @@ +domain = $this->get('domain'); + $ipAddress = $this->get('ip_address'); + $this->ipAddress = $ipAddress; + $this->network = Util::cidr($ipAddress, $this->get('prefix_len')); + } +} diff --git a/vendor/geoip2/geoip2/src/Model/Enterprise.php b/vendor/geoip2/geoip2/src/Model/Enterprise.php new file mode 100644 index 0000000..c63469b --- /dev/null +++ b/vendor/geoip2/geoip2/src/Model/Enterprise.php @@ -0,0 +1,15 @@ +autonomousSystemNumber = $this->get('autonomous_system_number'); + $this->autonomousSystemOrganization = + $this->get('autonomous_system_organization'); + $this->isp = $this->get('isp'); + $this->mobileCountryCode = $this->get('mobile_country_code'); + $this->mobileNetworkCode = $this->get('mobile_network_code'); + $this->organization = $this->get('organization'); + + $ipAddress = $this->get('ip_address'); + $this->ipAddress = $ipAddress; + $this->network = Util::cidr($ipAddress, $this->get('prefix_len')); + } +} diff --git a/vendor/geoip2/geoip2/src/ProviderInterface.php b/vendor/geoip2/geoip2/src/ProviderInterface.php new file mode 100644 index 0000000..7d14891 --- /dev/null +++ b/vendor/geoip2/geoip2/src/ProviderInterface.php @@ -0,0 +1,22 @@ + + */ + private $locales; + + /** + * @ignore + */ + public function __construct(?array $record, array $locales = ['en']) + { + $this->locales = $locales; + parent::__construct($record); + } + + /** + * @ignore + * + * @return mixed + */ + public function __get(string $attr) + { + if ($attr === 'name') { + return $this->name(); + } + + return parent::__get($attr); + } + + /** + * @ignore + */ + public function __isset(string $attr): bool + { + if ($attr === 'name') { + return $this->firstSetNameLocale() !== null; + } + + return parent::__isset($attr); + } + + private function name(): ?string + { + $locale = $this->firstSetNameLocale(); + + // @phpstan-ignore-next-line + return $locale === null ? null : $this->names[$locale]; + } + + private function firstSetNameLocale(): ?string + { + foreach ($this->locales as $locale) { + if (isset($this->names[$locale])) { + return $locale; + } + } + + return null; + } +} diff --git a/vendor/geoip2/geoip2/src/Record/AbstractRecord.php b/vendor/geoip2/geoip2/src/Record/AbstractRecord.php new file mode 100644 index 0000000..5ddb3c6 --- /dev/null +++ b/vendor/geoip2/geoip2/src/Record/AbstractRecord.php @@ -0,0 +1,67 @@ + + */ + private $record; + + /** + * @ignore + */ + public function __construct(?array $record) + { + $this->record = isset($record) ? $record : []; + } + + /** + * @ignore + * + * @return mixed + */ + public function __get(string $attr) + { + // XXX - kind of ugly but greatly reduces boilerplate code + $key = $this->attributeToKey($attr); + + if ($this->__isset($attr)) { + return $this->record[$key]; + } + if ($this->validAttribute($attr)) { + if (preg_match('/^is_/', $key)) { + return false; + } + + return null; + } + + throw new \RuntimeException("Unknown attribute: $attr"); + } + + public function __isset(string $attr): bool + { + return $this->validAttribute($attr) + && isset($this->record[$this->attributeToKey($attr)]); + } + + private function attributeToKey(string $attr): string + { + return strtolower(preg_replace('/([A-Z])/', '_\1', $attr)); + } + + private function validAttribute(string $attr): bool + { + // @phpstan-ignore-next-line + return \in_array($attr, $this->validAttributes, true); + } + + public function jsonSerialize(): ?array + { + return $this->record; + } +} diff --git a/vendor/geoip2/geoip2/src/Record/City.php b/vendor/geoip2/geoip2/src/Record/City.php new file mode 100644 index 0000000..f25dcb3 --- /dev/null +++ b/vendor/geoip2/geoip2/src/Record/City.php @@ -0,0 +1,33 @@ + + */ + protected $validAttributes = ['confidence', 'geonameId', 'names']; +} diff --git a/vendor/geoip2/geoip2/src/Record/Continent.php b/vendor/geoip2/geoip2/src/Record/Continent.php new file mode 100644 index 0000000..103e2e3 --- /dev/null +++ b/vendor/geoip2/geoip2/src/Record/Continent.php @@ -0,0 +1,36 @@ + + */ + protected $validAttributes = [ + 'code', + 'geonameId', + 'names', + ]; +} diff --git a/vendor/geoip2/geoip2/src/Record/Country.php b/vendor/geoip2/geoip2/src/Record/Country.php new file mode 100644 index 0000000..3009ebc --- /dev/null +++ b/vendor/geoip2/geoip2/src/Record/Country.php @@ -0,0 +1,44 @@ + + */ + protected $validAttributes = [ + 'confidence', + 'geonameId', + 'isInEuropeanUnion', + 'isoCode', + 'names', + ]; +} diff --git a/vendor/geoip2/geoip2/src/Record/Location.php b/vendor/geoip2/geoip2/src/Record/Location.php new file mode 100644 index 0000000..cb6111c --- /dev/null +++ b/vendor/geoip2/geoip2/src/Record/Location.php @@ -0,0 +1,56 @@ + + */ + protected $validAttributes = [ + 'averageIncome', + 'accuracyRadius', + 'latitude', + 'longitude', + 'metroCode', + 'populationDensity', + 'postalCode', + 'postalConfidence', + 'timeZone', + ]; +} diff --git a/vendor/geoip2/geoip2/src/Record/MaxMind.php b/vendor/geoip2/geoip2/src/Record/MaxMind.php new file mode 100644 index 0000000..e972506 --- /dev/null +++ b/vendor/geoip2/geoip2/src/Record/MaxMind.php @@ -0,0 +1,23 @@ + + */ + protected $validAttributes = ['queriesRemaining']; +} diff --git a/vendor/geoip2/geoip2/src/Record/Postal.php b/vendor/geoip2/geoip2/src/Record/Postal.php new file mode 100644 index 0000000..3e9c237 --- /dev/null +++ b/vendor/geoip2/geoip2/src/Record/Postal.php @@ -0,0 +1,30 @@ + + */ + protected $validAttributes = ['code', 'confidence']; +} diff --git a/vendor/geoip2/geoip2/src/Record/RepresentedCountry.php b/vendor/geoip2/geoip2/src/Record/RepresentedCountry.php new file mode 100644 index 0000000..727c034 --- /dev/null +++ b/vendor/geoip2/geoip2/src/Record/RepresentedCountry.php @@ -0,0 +1,33 @@ +military + * but this could expand to include other types in the future. + */ +class RepresentedCountry extends Country +{ + /** + * @ignore + * + * @var array + */ + protected $validAttributes = [ + 'confidence', + 'geonameId', + 'isInEuropeanUnion', + 'isoCode', + 'names', + 'type', + ]; +} diff --git a/vendor/geoip2/geoip2/src/Record/Subdivision.php b/vendor/geoip2/geoip2/src/Record/Subdivision.php new file mode 100644 index 0000000..0e83549 --- /dev/null +++ b/vendor/geoip2/geoip2/src/Record/Subdivision.php @@ -0,0 +1,44 @@ + + */ + protected $validAttributes = [ + 'confidence', + 'geonameId', + 'isoCode', + 'names', + ]; +} diff --git a/vendor/geoip2/geoip2/src/Record/Traits.php b/vendor/geoip2/geoip2/src/Record/Traits.php new file mode 100644 index 0000000..8000d50 --- /dev/null +++ b/vendor/geoip2/geoip2/src/Record/Traits.php @@ -0,0 +1,158 @@ +The user type associated with the IP + * address. This can be one of the following values:

+ *
    + *
  • business + *
  • cafe + *
  • cellular + *
  • college + *
  • consumer_privacy_network + *
  • content_delivery_network + *
  • dialup + *
  • government + *
  • hosting + *
  • library + *
  • military + *
  • residential + *
  • router + *
  • school + *
  • search_engine_spider + *
  • traveler + *
+ *

+ * This attribute is only available from the Insights web service and the + * GeoIP2 Enterprise database. + *

+ */ +class Traits extends AbstractRecord +{ + /** + * @ignore + * + * @var array + */ + protected $validAttributes = [ + 'autonomousSystemNumber', + 'autonomousSystemOrganization', + 'connectionType', + 'domain', + 'ipAddress', + 'isAnonymous', + 'isAnonymousProxy', + 'isAnonymousVpn', + 'isHostingProvider', + 'isLegitimateProxy', + 'isp', + 'isPublicProxy', + 'isResidentialProxy', + 'isSatelliteProvider', + 'isTorExitNode', + 'mobileCountryCode', + 'mobileNetworkCode', + 'network', + 'organization', + 'staticIpScore', + 'userCount', + 'userType', + ]; + + public function __construct(?array $record) + { + if (!isset($record['network']) && isset($record['ip_address'], $record['prefix_len'])) { + $record['network'] = Util::cidr($record['ip_address'], $record['prefix_len']); + } + + parent::__construct($record); + } +} diff --git a/vendor/geoip2/geoip2/src/Util.php b/vendor/geoip2/geoip2/src/Util.php new file mode 100644 index 0000000..e0a03be --- /dev/null +++ b/vendor/geoip2/geoip2/src/Util.php @@ -0,0 +1,36 @@ + 0; $i++) { + $b = $ipBytes[$i]; + if ($curPrefix < 8) { + $shiftN = 8 - $curPrefix; + $b = \chr(0xFF & (\ord($b) >> $shiftN) << $shiftN); + } + $networkBytes[$i] = $b; + $curPrefix -= 8; + } + + $network = inet_ntop($networkBytes); + + return "$network/$prefixLen"; + } +} diff --git a/vendor/geoip2/geoip2/src/WebService/Client.php b/vendor/geoip2/geoip2/src/WebService/Client.php new file mode 100644 index 0000000..18d979d --- /dev/null +++ b/vendor/geoip2/geoip2/src/WebService/Client.php @@ -0,0 +1,255 @@ + + */ + private $locales; + + /** + * @var WsClient + */ + private $client; + + /** + * @var string + */ + private static $basePath = '/geoip/v2.1'; + + public const VERSION = 'v2.13.0'; + + /** + * Constructor. + * + * @param int $accountId your MaxMind account ID + * @param string $licenseKey your MaxMind license key + * @param array $locales list of locale codes to use in name property + * from most preferred to least preferred + * @param array $options array of options. Valid options include: + * * `host` - The host to use when querying the web + * service. To query the GeoLite2 web service + * instead of the GeoIP2 web service, set the + * host to `geolite.info`. + * * `timeout` - Timeout in seconds. + * * `connectTimeout` - Initial connection timeout in seconds. + * * `proxy` - The HTTP proxy to use. May include a schema, port, + * username, and password, e.g., + * `http://username:password@127.0.0.1:10`. + */ + public function __construct( + int $accountId, + string $licenseKey, + array $locales = ['en'], + array $options = [] + ) { + $this->locales = $locales; + + // This is for backwards compatibility. Do not remove except for a + // major version bump. + // @phpstan-ignore-next-line + if (\is_string($options)) { + $options = ['host' => $options]; + } + + if (!isset($options['host'])) { + $options['host'] = 'geoip.maxmind.com'; + } + + $options['userAgent'] = $this->userAgent(); + + $this->client = new WsClient($accountId, $licenseKey, $options); + } + + private function userAgent(): string + { + return 'GeoIP2-API/' . self::VERSION; + } + + /** + * This method calls the City Plus service. + * + * @param string $ipAddress IPv4 or IPv6 address as a string. If no + * address is provided, the address that the web service is called + * from will be used. + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address you + * provided is not in our database (e.g., a private address). + * @throws \GeoIp2\Exception\AuthenticationException if there is a problem + * with the account ID or license key that you provided + * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out + * of queries + * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is + * invalid for some other reason. This may indicate an issue + * with this API. Please report the error to MaxMind. + * @throws \GeoIp2\Exception\HttpException if an unexpected HTTP error code or message was returned. + * This could indicate a problem with the connection between + * your server and the web service or that the web service + * returned an invalid document or 500 error code + * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent + * class to the above exceptions. It will be thrown directly + * if a 200 status code is returned but the body is invalid. + */ + public function city(string $ipAddress = 'me'): City + { + // @phpstan-ignore-next-line + return $this->responseFor('city', City::class, $ipAddress); + } + + /** + * This method calls the Country service. + * + * @param string $ipAddress IPv4 or IPv6 address as a string. If no + * address is provided, the address that the web service is called + * from will be used. + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address you provided is not in our database (e.g., + * a private address). + * @throws \GeoIp2\Exception\AuthenticationException if there is a problem + * with the account ID or license key that you provided + * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out of queries + * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is + * invalid for some other reason. This may indicate an + * issue with this API. Please report the error to MaxMind. + * @throws \GeoIp2\Exception\HttpException if an unexpected HTTP error + * code or message was returned. This could indicate a problem + * with the connection between your server and the web service + * or that the web service returned an invalid document or 500 + * error code. + * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent class to the above exceptions. It + * will be thrown directly if a 200 status code is returned but + * the body is invalid. + */ + public function country(string $ipAddress = 'me'): Country + { + return $this->responseFor('country', Country::class, $ipAddress); + } + + /** + * This method calls the Insights service. Insights is only supported by + * the GeoIP2 web service. The GeoLite2 web service does not support it. + * + * @param string $ipAddress IPv4 or IPv6 address as a string. If no + * address is provided, the address that the web service is called + * from will be used. + * + * @throws \GeoIp2\Exception\AddressNotFoundException if the address you + * provided is not in our database (e.g., a private address). + * @throws \GeoIp2\Exception\AuthenticationException if there is a problem + * with the account ID or license key that you provided + * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out + * of queries + * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is + * invalid for some other reason. This may indicate an + * issue with this API. Please report the error to MaxMind. + * @throws \GeoIp2\Exception\HttpException if an unexpected HTTP error code or message was returned. + * This could indicate a problem with the connection between + * your server and the web service or that the web service + * returned an invalid document or 500 error code + * @throws \GeoIp2\Exception\GeoIp2Exception This serves as the parent + * class to the above exceptions. It will be thrown directly + * if a 200 status code is returned but the body is invalid. + */ + public function insights(string $ipAddress = 'me'): Insights + { + // @phpstan-ignore-next-line + return $this->responseFor('insights', Insights::class, $ipAddress); + } + + private function responseFor(string $endpoint, string $class, string $ipAddress): Country + { + $path = implode('/', [self::$basePath, $endpoint, $ipAddress]); + + try { + $service = (new \ReflectionClass($class))->getShortName(); + $body = $this->client->get('GeoIP2 ' . $service, $path); + } catch (\MaxMind\Exception\IpAddressNotFoundException $ex) { + throw new AddressNotFoundException( + $ex->getMessage(), + $ex->getStatusCode(), + $ex + ); + } catch (\MaxMind\Exception\AuthenticationException $ex) { + throw new AuthenticationException( + $ex->getMessage(), + $ex->getStatusCode(), + $ex + ); + } catch (\MaxMind\Exception\InsufficientFundsException $ex) { + throw new OutOfQueriesException( + $ex->getMessage(), + $ex->getStatusCode(), + $ex + ); + } catch (\MaxMind\Exception\InvalidRequestException $ex) { + throw new InvalidRequestException( + $ex->getMessage(), + $ex->getErrorCode(), + $ex->getStatusCode(), + $ex->getUri(), + $ex + ); + } catch (\MaxMind\Exception\HttpException $ex) { + throw new HttpException( + $ex->getMessage(), + $ex->getStatusCode(), + $ex->getUri(), + $ex + ); + } catch (\MaxMind\Exception\WebServiceException $ex) { + throw new GeoIp2Exception( + $ex->getMessage(), + $ex->getCode(), + $ex + ); + } + + return new $class($body, $this->locales); + } +} diff --git a/vendor/league/uri-interfaces/Contracts/AuthorityInterface.php b/vendor/league/uri-interfaces/Contracts/AuthorityInterface.php new file mode 100644 index 0000000..9c364f3 --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/AuthorityInterface.php @@ -0,0 +1,93 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +use League\Uri\Exceptions\MissingFeature; +use League\Uri\Exceptions\SyntaxError; +use Stringable; + +interface AuthorityInterface extends UriComponentInterface +{ + /** + * Returns the host component of the authority. + */ + public function getHost(): ?string; + + /** + * Returns the port component of the authority. + */ + public function getPort(): ?int; + + /** + * Returns the user information component of the authority. + */ + public function getUserInfo(): ?string; + + /** + * Returns an associative array containing all the Authority components. + * + * The returned a hashmap similar to PHP's parse_url return value + * + * @link https://tools.ietf.org/html/rfc3986 + * + * @return array{user: ?string, pass : ?string, host: ?string, port: ?int} + */ + public function components(): array; + + /** + * Return an instance with the specified host. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified host. + * + * A null value provided for the host is equivalent to removing the host + * information. + * + * @throws SyntaxError for invalid component or transformations + * that would result in an object in invalid state. + * @throws MissingFeature for component or transformations + * requiring IDN support when IDN support is not present + * or misconfigured. + */ + public function withHost(Stringable|string|null $host): self; + + /** + * Return an instance with the specified port. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified port. + * + * A null value provided for the port is equivalent to removing the port + * information. + * + * @throws SyntaxError for invalid component or transformations + * that would result in an object in invalid state. + */ + public function withPort(?int $port): self; + + /** + * Return an instance with the specified user information. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified user information. + * + * Password is optional, but the user information MUST include the + * user; a null value for the user is equivalent to removing user + * information. + * + * @throws SyntaxError for invalid component or transformations + * that would result in an object in invalid state. + */ + public function withUserInfo(Stringable|string|null $user, Stringable|string|null $password = null): self; +} diff --git a/vendor/league/uri-interfaces/Contracts/Conditionable.php b/vendor/league/uri-interfaces/Contracts/Conditionable.php new file mode 100644 index 0000000..385a78c --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/Conditionable.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +interface Conditionable +{ + /** + * Apply the callback if the given "condition" is (or resolves to) true. + * + * @param (callable(static): bool)|bool $condition + * @param callable(static): (static|null) $onSuccess + * @param ?callable(static): (static|null) $onFail + */ + public function when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null): static; +} diff --git a/vendor/league/uri-interfaces/Contracts/DataPathInterface.php b/vendor/league/uri-interfaces/Contracts/DataPathInterface.php new file mode 100644 index 0000000..01f9c40 --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/DataPathInterface.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +use SplFileObject; +use Stringable; + +interface DataPathInterface extends PathInterface +{ + /** + * Retrieve the data mime type associated to the URI. + * + * If no mimetype is present, this method MUST return the default mimetype 'text/plain'. + * + * @see http://tools.ietf.org/html/rfc2397#section-2 + */ + public function getMimeType(): string; + + /** + * Retrieve the parameters associated with the Mime Type of the URI. + * + * If no parameters is present, this method MUST return the default parameter 'charset=US-ASCII'. + * + * @see http://tools.ietf.org/html/rfc2397#section-2 + */ + public function getParameters(): string; + + /** + * Retrieve the mediatype associated with the URI. + * + * If no mediatype is present, this method MUST return the default parameter 'text/plain;charset=US-ASCII'. + * + * @see http://tools.ietf.org/html/rfc2397#section-3 + * + * @return string The URI scheme. + */ + public function getMediaType(): string; + + /** + * Retrieves the data string. + * + * Retrieves the data part of the path. If no data part is provided return + * an empty string + */ + public function getData(): string; + + /** + * Tells whether the data is binary safe encoded. + */ + public function isBinaryData(): bool; + + /** + * Save the data to a specific file. + */ + public function save(string $path, string $mode = 'w'): SplFileObject; + + /** + * Returns an instance where the data part is base64 encoded. + * + * This method MUST retain the state of the current instance, and return + * an instance where the data part is base64 encoded + */ + public function toBinary(): self; + + /** + * Returns an instance where the data part is url encoded following RFC3986 rules. + * + * This method MUST retain the state of the current instance, and return + * an instance where the data part is url encoded + */ + public function toAscii(): self; + + /** + * Return an instance with the specified mediatype parameters. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified mediatype parameters. + * + * Users must provide encoded characters. + * + * An empty parameters value is equivalent to removing the parameter. + */ + public function withParameters(Stringable|string $parameters): self; +} diff --git a/vendor/league/uri-interfaces/Contracts/DomainHostInterface.php b/vendor/league/uri-interfaces/Contracts/DomainHostInterface.php new file mode 100644 index 0000000..a2f1745 --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/DomainHostInterface.php @@ -0,0 +1,125 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +use BackedEnum; +use Countable; +use Iterator; +use IteratorAggregate; +use League\Uri\Exceptions\SyntaxError; +use Stringable; + +/** + * @extends IteratorAggregate + * + * @method bool isSubdomainOf(BackedEnum|Stringable|string|null $parentHost) Tells whether the current domain instance is a subdomain of the parent host. + * @method bool hasSubdomain(BackedEnum|Stringable|string|null $childHost) Tells whether the submitted host is a subdomain of the current instance. + * @method bool isSiblingOf(BackedEnum|Stringable|string|null $siblingHost) Tells whether the submitted host share the same parent domain as the current instance. + * @method static commonAncestorWith(BackedEnum|Stringable|string|null $other) Returns the common longest ancestor between 2 domain. The returned domain is empty if no ancestor is found + * @method static parentHost() Returns the current parent domain for the current instance. The returned domain is empty if no ancestor is found + * @method bool isEmpty() Tells whether the domain contains any label. + */ +interface DomainHostInterface extends Countable, HostInterface, IteratorAggregate +{ + /** + * Returns the labels total number. + */ + public function count(): int; + + /** + * Iterate over the Domain labels. + * + * @return Iterator + */ + public function getIterator(): Iterator; + + /** + * Retrieves a single host label. + * + * If the label offset has not been set, returns the null value. + */ + public function get(int $offset): ?string; + + /** + * Returns the associated key for a specific label or all the keys. + * + * @return int[] + */ + public function keys(?string $label = null): array; + + /** + * Tells whether the domain is absolute. + */ + public function isAbsolute(): bool; + + /** + * Prepends a label to the host. + */ + public function prepend(Stringable|string $label): self; + + /** + * Appends a label to the host. + */ + public function append(Stringable|string $label): self; + + /** + * Extracts a slice of $length elements starting at position $offset from the host. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the selected slice. + * + * If $length is null it returns all elements from $offset to the end of the Domain. + */ + public function slice(int $offset, ?int $length = null): self; + + /** + * Returns an instance with its Root label. + * + * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 + */ + public function withRootLabel(): self; + + /** + * Returns an instance without its Root label. + * + * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 + */ + public function withoutRootLabel(): self; + + /** + * Returns an instance with the modified label. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the new label + * + * If $key is non-negative, the added label will be the label at $key position from the start. + * If $key is negative, the added label will be the label at $key position from the end. + * + * @throws SyntaxError If the key is invalid + */ + public function withLabel(int $key, Stringable|string $label): self; + + /** + * Returns an instance without the specified label. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified component + * + * If $key is non-negative, the removed label will be the label at $key position from the start. + * If $key is negative, the removed label will be the label at $key position from the end. + * + * @throws SyntaxError If the key is invalid + */ + public function withoutLabel(int ...$keys): self; +} diff --git a/vendor/league/uri-interfaces/Contracts/FragmentDirective.php b/vendor/league/uri-interfaces/Contracts/FragmentDirective.php new file mode 100644 index 0000000..e85471c --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/FragmentDirective.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +use Stringable; + +/** + * @see https://wicg.github.io/scroll-to-text-fragment/#the-fragment-directive + * + * @method string toFragmentValue() returns the encoded string representation of the directive as a fragment string + */ +interface FragmentDirective extends Stringable +{ + /** + * The decoded Directive name. + * + * @return non-empty-string + */ + public function name(): string; + + /** + * The decoded Directive value. + */ + public function value(): ?string; + + /** + * The encoded string representation of the directive. + */ + public function toString(): string; + + /** + * The encoded string representation of the fragment using + * the Stringable interface. + * + * @see FragmentDirective::toString() + */ + public function __toString(): string; + + /** + * Tells whether the submitted value is equals to the string + * representation of the given directive. + */ + public function equals(mixed $directive): bool; +} diff --git a/vendor/league/uri-interfaces/Contracts/FragmentInterface.php b/vendor/league/uri-interfaces/Contracts/FragmentInterface.php new file mode 100644 index 0000000..440a087 --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/FragmentInterface.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +/** + * @method self normalize() returns the normalized string representation of the component + */ +interface FragmentInterface extends UriComponentInterface +{ + /** + * Returns the decoded fragment. + */ + public function decoded(): ?string; +} diff --git a/vendor/league/uri-interfaces/Contracts/HostInterface.php b/vendor/league/uri-interfaces/Contracts/HostInterface.php new file mode 100644 index 0000000..48d8abe --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/HostInterface.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +/** + * @method string|null encoded() returns RFC3986 encoded host + */ +interface HostInterface extends UriComponentInterface +{ + /** + * Returns the ascii representation. + */ + public function toAscii(): ?string; + + /** + * Returns the unicode representation. + */ + public function toUnicode(): ?string; + + /** + * Returns the IP version. + * + * If the host is a not an IP this method will return null + */ + public function getIpVersion(): ?string; + + /** + * Returns the IP component If the Host is an IP address. + * + * If the host is a not an IP this method will return null + */ + public function getIp(): ?string; + + /** + * Tells whether the host is a domain name. + */ + public function isDomain(): bool; + + /** + * Tells whether the host is an IP Address. + */ + public function isIp(): bool; + + /** + * Tells whether the host is a registered name. + */ + public function isRegisteredName(): bool; +} diff --git a/vendor/league/uri-interfaces/Contracts/IpHostInterface.php b/vendor/league/uri-interfaces/Contracts/IpHostInterface.php new file mode 100644 index 0000000..7daac22 --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/IpHostInterface.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +interface IpHostInterface extends HostInterface +{ + /** + * Tells whether the host is an IPv4 address. + */ + public function isIpv4(): bool; + + /** + * Tells whether the host is an IPv6 address. + */ + public function isIpv6(): bool; + + /** + * Tells whether the host is an IPv6 address. + */ + public function isIpFuture(): bool; + + /** + * Tells whether the host has a ZoneIdentifier. + * + * @see http://tools.ietf.org/html/rfc6874#section-4 + */ + public function hasZoneIdentifier(): bool; + + /** + * Returns a host without its zone identifier according to RFC6874. + * + * This method MUST retain the state of the current instance, and return + * an instance without the host zone identifier according to RFC6874 + * + * @see http://tools.ietf.org/html/rfc6874#section-4 + */ + public function withoutZoneIdentifier(): self; +} diff --git a/vendor/league/uri-interfaces/Contracts/PathInterface.php b/vendor/league/uri-interfaces/Contracts/PathInterface.php new file mode 100644 index 0000000..1408eec --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/PathInterface.php @@ -0,0 +1,93 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +use League\Uri\Exceptions\SyntaxError; + +/** + * @method static normalize() returns the normalized string representation of the component + */ +interface PathInterface extends UriComponentInterface +{ + /** + * Returns the decoded path. + */ + public function decoded(): string; + + /** + * Tells whether the path is absolute or relative. + */ + public function isAbsolute(): bool; + + /** + * Tells whether the path has a trailing slash. + */ + public function hasTrailingSlash(): bool; + + /** + * Returns an instance without dot segments. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the path component normalized by removing + * the dot segment. + * + * @throws SyntaxError for invalid component or transformations + * that would result in a object in invalid state. + */ + public function withoutDotSegments(): self; + + /** + * Returns an instance with a leading slash. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the path component with a leading slash + * + * @throws SyntaxError for invalid component or transformations + * that would result in a object in invalid state. + */ + public function withLeadingSlash(): self; + + /** + * Returns an instance without a leading slash. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the path component without a leading slash + * + * @throws SyntaxError for invalid component or transformations + * that would result in a object in invalid state. + */ + public function withoutLeadingSlash(): self; + + /** + * Returns an instance with a trailing slash. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the path component with a trailing slash + * + * @throws SyntaxError for invalid component or transformations + * that would result in a object in invalid state. + */ + public function withTrailingSlash(): self; + + /** + * Returns an instance without a trailing slash. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the path component without a trailing slash + * + * @throws SyntaxError for invalid component or transformations + * that would result in a object in invalid state. + */ + public function withoutTrailingSlash(): self; +} diff --git a/vendor/league/uri-interfaces/Contracts/PortInterface.php b/vendor/league/uri-interfaces/Contracts/PortInterface.php new file mode 100644 index 0000000..7230c4a --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/PortInterface.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +interface PortInterface extends UriComponentInterface +{ + /** + * Returns the integer representation of the Port. + */ + public function toInt(): ?int; +} diff --git a/vendor/league/uri-interfaces/Contracts/QueryInterface.php b/vendor/league/uri-interfaces/Contracts/QueryInterface.php new file mode 100644 index 0000000..1b2ac33 --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/QueryInterface.php @@ -0,0 +1,272 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +use BackedEnum; +use Countable; +use Deprecated; +use Iterator; +use IteratorAggregate; +use League\Uri\QueryComposeMode; +use League\Uri\StringCoercionMode; +use Stringable; + +/** + * @extends IteratorAggregate + * + * @method string|null toFormData() Returns the string representation using the application/www-form-urlencoded rules + * @method string|null toRFC3986() Returns the string representation using RFC3986 rules + * @method string|null first(string $key) Returns the first value associated with the given name + * @method string|null last(string $key) Returns the first value associated with the given name + * @method int|null indexOf(string $key, int $nth = 0) Returns the offset of the pair based on its key and its nth occurrence; negative occurrences are supported + * @method int|null indexOfValue(?string $value, int $nth = 0) Returns the offset of the pair based on its value and its nth occurrence; negative occurrences are supported + * @method array pair(int $offset) Returns the key/value pair at the given numeric offset; negative occurrences are supported + * @method int countDistinctKeys() Returns the total number of distinct keys + * @method string|null valueAt(int $offset): Returns the value at the given numeric offset; negative occurrences are supported + * @method string keyAt(int $offset): Returns the key at the given numeric offset; negative occurrences are supported + * @method self normalize() returns the normalized string representation of the component + * @method self withoutPairByKey(string ...$keys) Returns an instance without pairs with the specified keys. + * @method self withoutPairByValue(array|BackedEnum|Stringable|string|int|bool|null $values, StringCoercionMode $coercionMode = StringCoercionMode::Native) Returns an instance without pairs with the specified values. + * @method self withoutPairByKeyValue(string $key, BackedEnum|Stringable|string|int|bool|null $value, StringCoercionMode $coercionMode = StringCoercionMode::Native) Returns an instance without pairs with the specified key/value pair + * @method bool hasPair(string $key, ?string $value) Tells whether the pair exists in the query. + * @method array getList(string $name) Returns the list associated with the given name or an empty array if it does not exist. + * @method bool hasList(string ...$names) Tells whether the parameter list exists in the query. + * @method self appendList(string $name, array $values, QueryComposeMode $composeMode = QueryComposeMode::Native) Appends a parameter to the query string + * @method self withList(string $name, array $values, QueryComposeMode $composeMode = QueryComposeMode::Native) Adds a new parameter to the query string and remove any previously set values + * @method self withoutList(string ...$names) Removes any given list associated with the given names + * @method self withoutLists() Removes all lists from the query string + * @method self onlyLists() Removes all pairs without a valid PHP's bracket notation + */ +interface QueryInterface extends Countable, IteratorAggregate, UriComponentInterface +{ + /** + * Returns the query separator. + * + * @return non-empty-string + */ + public function getSeparator(): string; + + /** + * Returns the number of key/value pairs present in the object. + */ + public function count(): int; + + /** + * Returns an iterator allowing to go through all key/value pairs contained in this object. + * + * The pair is represented as an array where the first value is the pair key + * and the second value the pair value. + * + * The key of each pair is a string + * The value of each pair is a scalar or the null value + * + * @return Iterator + */ + public function getIterator(): Iterator; + + /** + * Returns an iterator allowing to go through all key/value pairs contained in this object. + * + * The return type is as an Iterator where its offset is the pair key and its value the pair value. + * + * The key of each pair is a string + * The value of each pair is a scalar or the null value + * + * @return iterable + */ + public function pairs(): iterable; + + /** + * Tells whether a list of pair with a specific key exists. + * + * @see https://url.spec.whatwg.org/#dom-urlsearchparams-has + */ + public function has(string ...$keys): bool; + + /** + * Returns the first value associated to the given pair name. + * + * If no value is found null is returned + * + * @see https://url.spec.whatwg.org/#dom-urlsearchparams-get + */ + public function get(string $key): ?string; + + /** + * Returns all the values associated to the given pair name as an array or all + * the instance pairs. + * + * If no value is found an empty array is returned + * + * @see https://url.spec.whatwg.org/#dom-urlsearchparams-getall + * + * @return array + */ + public function getAll(string $key): array; + + /** + * Returns the store PHP variables as elements of an array. + * + * The result is similar as PHP parse_str when used with its + * second argument with the difference that variable names are + * not mangled. + * + * @see http://php.net/parse_str + * @see https://wiki.php.net/rfc/on_demand_name_mangling + * + * @return array the collection of stored PHP variables or the empty array if no input is given, + */ + public function parameters(): array; + + /** + * Returns the value attached to the specific key. + * + * The result is similar to PHP parse_str with the difference that variable + * names are not mangled. + * + * If a key is submitted it will return the value attached to it or null + * + * @see http://php.net/parse_str + * @see https://wiki.php.net/rfc/on_demand_name_mangling + * + * @return mixed the collection of stored PHP variables or the empty array if no input is given, + * the single value of a stored PHP variable or null if the variable is not present in the collection + */ + public function parameter(string $name): mixed; + + /** + * Tells whether a list of variable with specific names exists. + * + * @see https://url.spec.whatwg.org/#dom-urlsearchparams-has + */ + public function hasParameter(string ...$names): bool; + + /** + * Returns the RFC1738 encoded query. + */ + public function toRFC1738(): ?string; + + /** + * Returns an instance with a different separator. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the query component with a different separator + */ + public function withSeparator(string $separator): self; + + /** + * Returns an instance with the new pairs set to it. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified query + * + * @see ::withPair + */ + public function merge(Stringable|string $query): self; + + /** + * Returns an instance with the new pairs appended to it. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified query + * + * If the pair already exists the value will be added to it. + */ + public function append(Stringable|string $query): self; + + /** + * Returns a new instance with a specified key/value pair appended as a new pair. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified query + */ + public function appendTo(string $key, Stringable|string|int|bool|null $value): self; + + /** + * Sorts the query string by offset, maintaining offset to data correlations. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified query + * + * @see https://url.spec.whatwg.org/#dom-urlsearchparams-sort + */ + public function sort(): self; + + /** + * Returns an instance without duplicate key/value pair. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the query component normalized by removing + * duplicate pairs whose key/value are the same. + */ + public function withoutDuplicates(): self; + + /** + * Returns an instance without empty key/value where the value is the null value. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the query component normalized by removing + * empty pairs. + * + * A pair is considered empty if its value is equal to the null value + */ + public function withoutEmptyPairs(): self; + + /** + * Returns an instance where numeric indices associated to PHP's array like key are removed. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the query component normalized so that numeric indexes + * are removed from the pair key value. + * + * i.e.: toto[3]=bar[3]&foo=bar becomes toto[]=bar[3]&foo=bar + */ + public function withoutNumericIndices(): self; + + /** + * Returns an instance with a new key/value pair added to it. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified query + * + * If the pair already exists the value will replace the existing value. + * + * @see https://url.spec.whatwg.org/#dom-urlsearchparams-set + */ + public function withPair(string $key, Stringable|string|int|float|bool|null $value): self; + + /** + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated Since version 7.3.0 + * @codeCoverageIgnore + * @see QueryInterface::withoutPairByKey() + * + * Returns an instance without the specified keys. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified component + */ + #[Deprecated(message:'use League\Uri\Contracts\QueryInterface::withoutPairByKey() instead', since:'league/uri-interfaces:7.3.0')] + public function withoutPair(string ...$keys): self; + + /** + * Returns an instance without the specified params. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified component without PHP's value. + * PHP's mangled is not taken into account. + */ + public function withoutParameters(string ...$names): self; +} diff --git a/vendor/league/uri-interfaces/Contracts/SegmentedPathInterface.php b/vendor/league/uri-interfaces/Contracts/SegmentedPathInterface.php new file mode 100644 index 0000000..87355f4 --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/SegmentedPathInterface.php @@ -0,0 +1,149 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +use Countable; +use Iterator; +use IteratorAggregate; +use League\Uri\Exceptions\SyntaxError; +use Stringable; + +/** + * @extends IteratorAggregate + */ +interface SegmentedPathInterface extends Countable, IteratorAggregate, PathInterface +{ + /** + * Returns the total number of segments in the path. + */ + public function count(): int; + + /** + * Iterate over the path segment. + * + * @return Iterator + */ + public function getIterator(): Iterator; + + /** + * Returns parent directory's path. + */ + public function getDirname(): string; + + /** + * Returns the path basename. + */ + public function getBasename(): string; + + /** + * Returns the basename extension. + */ + public function getExtension(): string; + + /** + * Retrieves a single path segment. + * + * If the segment offset has not been set, returns null. + */ + public function get(int $offset): ?string; + + /** + * Returns the associated key for a specific segment. + * + * If a value is specified only the keys associated with + * the given value will be returned + * + * @return array + */ + public function keys(Stringable|string|null $segment = null): array; + + /** + * Appends a segment to the path. + */ + public function append(Stringable|string $path): self; + + /** + * Extracts a slice of $length elements starting at position $offset from the host. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the selected slice. + * + * If $length is null it returns all elements from $offset to the end of the Path. + */ + public function slice(int $offset, ?int $length = null): self; + + /** + * Prepends a segment to the path. + */ + public function prepend(Stringable|string $path): self; + + /** + * Returns an instance with the modified segment. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the new segment + * + * If $key is non-negative, the added segment will be the segment at $key position from the start. + * If $key is negative, the added segment will be the segment at $key position from the end. + * + * @throws SyntaxError If the key is invalid + */ + public function withSegment(int $key, Stringable|string $segment): self; + + /** + * Returns an instance without the specified segment. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the modified component + * + * If $key is non-negative, the removed segment will be the segment at $key position from the start. + * If $key is negative, the removed segment will be the segment at $key position from the end. + * + * @throws SyntaxError If the key is invalid + */ + public function withoutSegment(int ...$keys): self; + + /** + * Returns an instance without duplicate delimiters. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the path component normalized by removing + * multiple consecutive empty segment + */ + public function withoutEmptySegments(): self; + + /** + * Returns an instance with the specified parent directory's path. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the extension basename modified. + */ + public function withDirname(Stringable|string $path): self; + + /** + * Returns an instance with the specified basename. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the extension basename modified. + */ + public function withBasename(Stringable|string $basename): self; + + /** + * Returns an instance with the specified basename extension. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the extension basename modified. + */ + public function withExtension(Stringable|string $extension): self; +} diff --git a/vendor/league/uri-interfaces/Contracts/Transformable.php b/vendor/league/uri-interfaces/Contracts/Transformable.php new file mode 100644 index 0000000..957fa50 --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/Transformable.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +interface Transformable +{ + /** + * Apply a transformation to this instance and return a new instance. + * + * This method MUST retain the state of the current instance, and return + * a new instance of the same type. + * + * @param callable(static): static $callback + */ + public function transform(callable $callback): static; +} diff --git a/vendor/league/uri-interfaces/Contracts/UriAccess.php b/vendor/league/uri-interfaces/Contracts/UriAccess.php new file mode 100644 index 0000000..a74da57 --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/UriAccess.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +use Psr\Http\Message\UriInterface as Psr7UriInterface; + +/** + * @deprecated since version 7.6.0 + */ +interface UriAccess +{ + public function getUri(): UriInterface|Psr7UriInterface; + + /** + * Returns the RFC3986 string representation of the complete URI. + */ + public function getUriString(): string; +} diff --git a/vendor/league/uri-interfaces/Contracts/UriComponentInterface.php b/vendor/league/uri-interfaces/Contracts/UriComponentInterface.php new file mode 100644 index 0000000..fa550aa --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/UriComponentInterface.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +use JsonSerializable; +use Stringable; + +/** + * @method static when(callable|bool $condition, callable $onSuccess, ?callable $onFail = null) conditionally return a new instance + * @method bool equals(mixed $value) tells whether the submitted value is equal to the current instance value + */ +interface UriComponentInterface extends JsonSerializable, Stringable +{ + /** + * Returns the instance string representation. + * + * If the instance is defined, the value returned MUST be percent-encoded, + * but MUST NOT double-encode any characters. To determine what characters + * to encode, please refer to RFC 3986, Sections 2 and 3. + * + * If the instance is not defined null is returned + */ + public function value(): ?string; + + /** + * Returns the instance string representation. + * + * If the instance is defined, the value returned MUST be percent-encoded, + * but MUST NOT double-encode any characters. To determine what characters + * to encode, please refer to RFC 3986, Sections 2 and 3. + * + * If the instance is not defined, an empty string is returned + */ + public function toString(): string; + + /** + * Returns the instance string representation. + * + * If the instance is defined, the value returned MUST be percent-encoded, + * but MUST NOT double-encode any characters. To determine what characters + * to encode, please refer to RFC 3986, Sections 2 and 3. + * + * If the instance is not defined, an empty string is returned + */ + public function __toString(): string; + + /** + * Returns the instance json representation. + * + * If the instance is defined, the value returned MUST be percent-encoded, + * but MUST NOT double-encode any characters. To determine what characters + * to encode, please refer to RFC 3986 or RFC 1738. + * + * If the instance is not defined, null is returned + */ + public function jsonSerialize(): ?string; + + /** + * Returns the instance string representation with its optional URI delimiters. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode any + * characters. To determine what characters to encode, please refer to RFC 3986, + * Sections 2 and 3. + * + * If the instance is not defined, an empty string is returned + */ + public function getUriComponent(): string; +} diff --git a/vendor/league/uri-interfaces/Contracts/UriException.php b/vendor/league/uri-interfaces/Contracts/UriException.php new file mode 100644 index 0000000..c0fec2a --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/UriException.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +use Throwable; + +interface UriException extends Throwable +{ +} diff --git a/vendor/league/uri-interfaces/Contracts/UriInterface.php b/vendor/league/uri-interfaces/Contracts/UriInterface.php new file mode 100644 index 0000000..60e6c8e --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/UriInterface.php @@ -0,0 +1,321 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +use JsonSerializable; +use League\Uri\Exceptions\MissingFeature; +use League\Uri\Exceptions\SyntaxError; +use League\Uri\UriString; +use Stringable; + +/** + * @phpstan-import-type ComponentMap from UriString + * + * @method string|null getUsername() returns the user component of the URI. + * @method self withUsername(?string $user) returns a new URI instance with the user component updated. + * @method string|null getPassword() returns the scheme-specific information about how to gain authorization to access the resource. + * @method self withPassword(?string $password) returns a new URI instance with the password component updated. + * @method string toAsciiString() returns the string representation of the URI in its RFC3986 form + * @method string toUnicodeString() returns the string representation of the URI in its RFC3987 form (the host is in its IDN form) + * @method array toComponents() returns an associative array containing all the URI components. + * @method self normalize() returns a new URI instance with normalized components + * @method self resolve(UriInterface $uri) resolves a URI against a base URI using RFC3986 rules + * @method self relativize(UriInterface $uri) relativize a URI against a base URI using RFC3986 rules + */ +interface UriInterface extends JsonSerializable, Stringable +{ + /** + * Returns the string representation as a URI reference. + * + * @see http://tools.ietf.org/html/rfc3986#section-4.1 + */ + public function __toString(): string; + + /** + * Returns the string representation as a URI reference. + * + * @see http://tools.ietf.org/html/rfc3986#section-4.1 + */ + public function toString(): string; + + /** + * Returns the string representation as a URI reference. + * + * @see http://tools.ietf.org/html/rfc3986#section-4.1 + * @see ::__toString + */ + public function jsonSerialize(): string; + + /** + * Retrieve the scheme component of the URI. + * + * If no scheme is present, this method MUST return a null value. + * + * The value returned MUST be normalized to lowercase, per RFC 3986 + * Section 3.1. + * + * The trailing ":" character is not part of the scheme and MUST NOT be + * added. + * + * @see https://tools.ietf.org/html/rfc3986#section-3.1 + */ + public function getScheme(): ?string; + + /** + * Retrieve the authority component of the URI. + * + * If no scheme is present, this method MUST return a null value. + * + * If the port component is not set or is the standard port for the current + * scheme, it SHOULD NOT be included. + * + * @see https://tools.ietf.org/html/rfc3986#section-3.2 + */ + public function getAuthority(): ?string; + + /** + * Retrieve the user information component of the URI. + * + * If no scheme is present, this method MUST return a null value. + * + * If a user is present in the URI, this will return that value; + * additionally, if the password is also present, it will be appended to the + * user value, with a colon (":") separating the values. + * + * The trailing "@" character is not part of the user information and MUST + * NOT be added. + */ + public function getUserInfo(): ?string; + + /** + * Retrieve the host component of the URI. + * + * If no host is present this method MUST return a null value. + * + * The value returned MUST be normalized to lowercase, per RFC 3986 + * Section 3.2.2. + * + * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 + */ + public function getHost(): ?string; + + /** + * Retrieve the port component of the URI. + * + * If a port is present, and it is non-standard for the current scheme, + * this method MUST return it as an integer. If the port is the standard port + * used with the current scheme, this method SHOULD return null. + * + * If no port is present, and no scheme is present, this method MUST return + * a null value. + * + * If no port is present, but a scheme is present, this method MAY return + * the standard port for that scheme, but SHOULD return null. + */ + public function getPort(): ?int; + + /** + * Retrieve the path component of the URI. + * + * The path can either be empty or absolute (starting with a slash) or + * rootless (not starting with a slash). Implementations MUST support all + * three syntaxes. + * + * Normally, the empty path "" and absolute path "/" are considered equal as + * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically + * do this normalization because in contexts with a trimmed base path, e.g. + * the front controller, this difference becomes significant. It's the task + * of the user to handle both "" and "/". + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.3. + * + * As an example, if the value should include a slash ("/") not intended as + * delimiter between path segments, that value MUST be passed in encoded + * form (e.g., "%2F") to the instance. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.3 + */ + public function getPath(): string; + + /** + * Retrieve the query string of the URI. + * + * If no host is present this method MUST return a null value. + * + * The leading "?" character is not part of the query and MUST NOT be + * added. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.4. + * + * As an example, if a value in a key/value pair of the query string should + * include an ampersand ("&") not intended as a delimiter between values, + * that value MUST be passed in encoded form (e.g., "%26") to the instance. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.4 + */ + public function getQuery(): ?string; + + /** + * Retrieve the fragment component of the URI. + * + * If no host is present this method MUST return a null value. + * + * The leading "#" character is not part of the fragment and MUST NOT be + * added. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.5. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.5 + */ + public function getFragment(): ?string; + + /** + * Returns an associative array containing all the URI components. + * + * The returned array is similar to PHP's parse_url return value with the following + * differences: + * + *
    + *
  • All components are present in the returned array
  • + *
  • Empty and undefined component are treated differently. And empty component is + * set to the empty string while an undefined component is set to the `null` value.
  • + *
+ * + * @link https://tools.ietf.org/html/rfc3986 + * + * @return ComponentMap + */ + public function getComponents(): array; + + /** + * Return an instance with the specified scheme. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified scheme. + * + * A null value provided for the scheme is equivalent to removing the scheme + * information. + * + * @throws SyntaxError for invalid component or transformations + * that would result in an object in invalid state. + */ + public function withScheme(Stringable|string|null $scheme): self; + + /** + * Return an instance with the specified user information. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified user information. + * + * Password is optional, but the user information MUST include the + * user; a null value for the user is equivalent to removing user + * information. + * + * @throws SyntaxError for invalid component or transformations + * that would result in an object in invalid state. + */ + public function withUserInfo(Stringable|string|null $user, Stringable|string|null $password = null): self; + + /** + * Return an instance with the specified host. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified host. + * + * A null value provided for the host is equivalent to removing the host + * information. + * + * @throws SyntaxError for invalid component or transformations + * that would result in an object in invalid state. + * @throws MissingFeature for component or transformations + * requiring IDN support when IDN support is not present + * or misconfigured. + */ + public function withHost(Stringable|string|null $host): self; + + /** + * Return an instance with the specified port. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified port. + * + * A null value provided for the port is equivalent to removing the port + * information. + * + * @throws SyntaxError for invalid component or transformations + * that would result in an object in invalid state. + */ + public function withPort(?int $port): self; + + /** + * Return an instance with the specified path. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified path. + * + * The path can either be empty or absolute (starting with a slash) or + * rootless (not starting with a slash). Implementations MUST support all + * three syntaxes. + * + * Users can provide both encoded and decoded path characters. + * Implementations ensure the correct encoding as outlined in getPath(). + * + * @throws SyntaxError for invalid component or transformations + * that would result in an object in invalid state. + */ + public function withPath(Stringable|string $path): self; + + /** + * Return an instance with the specified query string. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified query string. + * + * Users can provide both encoded and decoded query characters. + * Implementations ensure the correct encoding as outlined in getQuery(). + * + * A null value provided for the query is equivalent to removing the query + * information. + * + * @throws SyntaxError for invalid component or transformations + * that would result in an object in invalid state. + */ + public function withQuery(Stringable|string|null $query): self; + + /** + * Return an instance with the specified URI fragment. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified URI fragment. + * + * Users can provide both encoded and decoded fragment characters. + * Implementations ensure the correct encoding as outlined in getFragment(). + * + * A null value provided for the fragment is equivalent to removing the fragment + * information. + * + * @throws SyntaxError for invalid component or transformations + * that would result in an object in invalid state. + */ + public function withFragment(Stringable|string|null $fragment): self; +} diff --git a/vendor/league/uri-interfaces/Contracts/UserInfoInterface.php b/vendor/league/uri-interfaces/Contracts/UserInfoInterface.php new file mode 100644 index 0000000..bd36b86 --- /dev/null +++ b/vendor/league/uri-interfaces/Contracts/UserInfoInterface.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Contracts; + +use Stringable; + +interface UserInfoInterface extends UriComponentInterface +{ + /** + * Returns the user component part. + */ + public function getUser(): ?string; + + /** + * Returns the pass component part. + */ + public function getPass(): ?string; + + /** + * Returns an associative array containing all the User Info components. + * + * The returned a hashmap similar to PHP's parse_url return value + * + * @link https://tools.ietf.org/html/rfc3986 + * + * @return array{user: ?string, pass : ?string} + */ + public function components(): array; + + /** + * Returns an instance with the specified user and/or pass. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified new username + * otherwise it returns the same instance unchanged. + * + * A variable equal to null is equivalent to removing the complete user information. + */ + public function withUser(Stringable|string|null $username): self; + + /** + * Returns an instance with the specified user and/or pass. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified password if the user is specified + * otherwise it returns the same instance unchanged. + * + * An empty user is equivalent to removing the user information. + */ + public function withPass(Stringable|string|null $password): self; +} diff --git a/vendor/league/uri-interfaces/Encoder.php b/vendor/league/uri-interfaces/Encoder.php new file mode 100644 index 0000000..cbd3f2e --- /dev/null +++ b/vendor/league/uri-interfaces/Encoder.php @@ -0,0 +1,506 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri; + +use BackedEnum; +use Closure; +use Deprecated; +use League\Uri\Exceptions\SyntaxError; +use League\Uri\IPv6\Converter as IPv6Converter; +use SensitiveParameter; +use Stringable; +use Throwable; + +use function explode; +use function filter_var; +use function gettype; +use function in_array; +use function preg_match; +use function preg_replace_callback; +use function rawurldecode; +use function rawurlencode; +use function sprintf; +use function str_starts_with; +use function strtolower; +use function strtoupper; + +use const FILTER_FLAG_IPV4; +use const FILTER_VALIDATE_IP; + +final class Encoder +{ + private const REGEXP_CHARS_INVALID = '/[\x00-\x1f\x7f]/'; + private const REGEXP_CHARS_ENCODED = ',%[A-Fa-f0-9]{2},'; + private const REGEXP_CHARS_PREVENTS_DECODING = ',% + 2[A-F|1-2|4-9]| + 3[0-9|B|D]| + 4[1-9|A-F]| + 5[0-9|A|F]| + 6[1-9|A-F]| + 7[0-9|E] + ,ix'; + private const REGEXP_PART_SUBDELIM = "\!\$&'\(\)\*\+,;\=%"; + private const REGEXP_PART_UNRESERVED = 'A-Za-z\d_\-.~'; + private const REGEXP_PART_ENCODED = '%(?![A-Fa-f\d]{2})'; + + /** + * Unreserved characters. + * + * @see https://www.rfc-editor.org/rfc/rfc3986.html#section-2.3 + */ + private const REGEXP_UNRESERVED_CHARACTERS = ',%(2[DdEe]|3[0-9]|4[1-9A-Fa-f]|5[AaFf]|6[1-9A-Fa-f]|7[0-9A-Ea-e]),'; + + /** + * Tell whether the user component is correctly encoded. + */ + public static function isUserEncoded(BackedEnum|Stringable|string|null $encoded): bool + { + static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.']+|'.self::REGEXP_PART_ENCODED.'/'; + + if ($encoded instanceof BackedEnum) { + $encoded = $encoded->value; + } + + return null === $encoded || 1 !== preg_match($pattern, (string) $encoded); + } + + /** + * Encode User. + * + * All generic delimiters MUST be encoded + */ + public static function encodeUser(BackedEnum|Stringable|string|null $user): ?string + { + static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.']+|'.self::REGEXP_PART_ENCODED.'/'; + + return self::encode($user, $pattern); + } + + /** + * Normalize user component. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986. + */ + public static function normalizeUser(BackedEnum|Stringable|string|null $user): ?string + { + return self::normalize(self::encodeUser(self::decodeUnreservedCharacters($user))); + } + + private static function normalize(?string $component): ?string + { + if (null === $component) { + return null; + } + + return (string) preg_replace_callback( + '/%[0-9a-f]{2}/i', + static fn (array $found) => strtoupper($found[0]), + $component + ); + } + + /** + * Tell whether the password component is correctly encoded. + */ + public static function isPasswordEncoded(#[SensitiveParameter] BackedEnum|Stringable|string|null $encoded): bool + { + static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.':]+|'.self::REGEXP_PART_ENCODED.'/'; + + if ($encoded instanceof BackedEnum) { + $encoded = $encoded->value; + } + + return null === $encoded || 1 !== preg_match($pattern, (string) $encoded); + } + + /** + * Encode Password. + * + * Generic delimiters ":" MUST NOT be encoded + */ + public static function encodePassword(#[SensitiveParameter] BackedEnum|Stringable|string|null $component): ?string + { + static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.':]+|'.self::REGEXP_PART_ENCODED.'/'; + + return self::encode($component, $pattern); + } + + /** + * Normalize password component. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986. + */ + public static function normalizePassword(#[SensitiveParameter] BackedEnum|Stringable|string|null $password): ?string + { + return self::normalize(self::encodePassword(self::decodeUnreservedCharacters($password))); + } + + /** + * Tell whether the userInfo component is correctly encoded. + */ + public static function isUserInfoEncoded(#[SensitiveParameter] BackedEnum|Stringable|string|null $userInfo): bool + { + if (null === $userInfo) { + return true; + } + + if ($userInfo instanceof BackedEnum) { + $userInfo = $userInfo->value; + } + + [$user, $password] = explode(':', (string) $userInfo, 2) + [1 => null]; + + return self::isUserEncoded($user) + && self::isPasswordEncoded($password); + } + + public static function encodeUserInfo(#[SensitiveParameter] BackedEnum|Stringable|string|null $userInfo): ?string + { + if (null === $userInfo) { + return null; + } + + if ($userInfo instanceof BackedEnum) { + $userInfo = $userInfo->value; + } + + [$user, $password] = explode(':', (string) $userInfo, 2) + [1 => null]; + $userInfo = self::encodeUser($user); + if (null === $password) { + return $userInfo; + } + + return $userInfo.':'.self::encodePassword($password); + } + + public static function normalizeUserInfo(#[SensitiveParameter] BackedEnum|Stringable|string|null $userInfo): ?string + { + if (null === $userInfo) { + return null; + } + + if ($userInfo instanceof BackedEnum) { + $userInfo = $userInfo->value; + } + + [$user, $password] = explode(':', (string) $userInfo, 2) + [1 => null]; + $userInfo = self::normalizeUser($user); + if (null === $password) { + return $userInfo; + } + + return $userInfo.':'.self::normalizePassword($password); + } + + /** + * Decodes all the URI component characters. + */ + public static function decodeAll(BackedEnum|Stringable|string|null $component): ?string + { + return self::decode($component, static fn (array $matches): string => rawurldecode($matches[0])); + } + + /** + * Decodes the URI component without decoding the unreserved characters which are already encoded. + */ + public static function decodeNecessary(BackedEnum|Stringable|string|int|null $component): ?string + { + $decoder = static function (array $matches): string { + if (1 === preg_match(self::REGEXP_CHARS_PREVENTS_DECODING, $matches[0])) { + return strtoupper($matches[0]); + } + + return rawurldecode($matches[0]); + }; + + return self::decode($component, $decoder); + } + + /** + * Decodes the component unreserved characters. + */ + public static function decodeUnreservedCharacters(BackedEnum|Stringable|string|null $str): ?string + { + if ($str instanceof BackedEnum) { + $str = $str->value; + } + + if (null === $str) { + return null; + } + + return preg_replace_callback( + self::REGEXP_UNRESERVED_CHARACTERS, + static fn (array $matches): string => rawurldecode($matches[0]), + (string) $str + ); + } + + /** + * Tell whether the path component is correctly encoded. + */ + public static function isPathEncoded(BackedEnum|Stringable|string|null $encoded): bool + { + static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.':@\/]+|'.self::REGEXP_PART_ENCODED.'/'; + + if ($encoded instanceof BackedEnum) { + $encoded = $encoded->value; + } + + return null === $encoded || 1 !== preg_match($pattern, (string) $encoded); + } + + /** + * Encode Path. + * + * Generic delimiters ":", "@", and "/" MUST NOT be encoded + */ + public static function encodePath(BackedEnum|Stringable|string|null $component): string + { + static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.':@\/]+|'.self::REGEXP_PART_ENCODED.'/'; + + return (string) self::encode($component, $pattern); + } + + /** + * Decodes the path component while preserving characters that should not be decoded in the context of a full valid URI. + */ + public static function decodePath(BackedEnum|Stringable|string|null $path): ?string + { + $decoder = static function (array $matches): string { + $encodedChar = strtoupper($matches[0]); + + return in_array($encodedChar, ['%2F', '%20', '%3F', '%23'], true) ? $encodedChar : rawurldecode($encodedChar); + }; + + return self::decode($path, $decoder); + } + + /** + * Normalize path component. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986. + */ + public static function normalizePath(BackedEnum|Stringable|string|null $component): ?string + { + return self::normalize(self::encodePath(self::decodePath($component))); + } + + /** + * Tell whether the query component is correctly encoded. + */ + public static function isQueryEncoded(BackedEnum|Stringable|string|null $encoded): bool + { + static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.'\/?%]+|'.self::REGEXP_PART_ENCODED.'/'; + if ($encoded instanceof BackedEnum) { + $encoded = $encoded->value; + } + + return null === $encoded || 1 !== preg_match($pattern, (string) $encoded); + } + + /** + * Decodes the query component while preserving characters that should not be decoded in the context of a full valid URI. + */ + public static function decodeQuery(BackedEnum|Stringable|string|null $path): ?string + { + $decoder = static function (array $matches): string { + $encodedChar = strtoupper($matches[0]); + + return in_array($encodedChar, ['%26', '%3D', '%20', '%23', '%3F'], true) ? $encodedChar : rawurldecode($encodedChar); + }; + + return self::decode($path, $decoder); + } + + /** + * Normalize the query component. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986. + */ + public static function normalizeQuery(BackedEnum|Stringable|string|null $query): ?string + { + return self::normalize(self::encodeQueryOrFragment(self::decodeQuery($query))); + } + + /** + * Tell whether the query component is correctly encoded. + */ + public static function isFragmentEncoded(BackedEnum|Stringable|string|null $encoded): bool + { + static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.':@\/?%]|'.self::REGEXP_PART_ENCODED.'/'; + + if ($encoded instanceof BackedEnum) { + $encoded = $encoded->value; + } + + return null === $encoded || 1 !== preg_match($pattern, (string) $encoded); + } + + /** + * Decodes the fragment component while preserving characters that should not be decoded in the context of a full valid URI. + */ + public static function decodeFragment(BackedEnum|Stringable|string|null $path): ?string + { + return self::decode($path, static fn (array $matches): string => '%20' === $matches[0] ? $matches[0] : rawurldecode($matches[0])); + } + + /** + * Normalize the fragment component. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986. + */ + public static function normalizeFragment(BackedEnum|Stringable|string|null $fragment): ?string + { + return self::normalize(self::encodeQueryOrFragment(self::decodeFragment($fragment))); + } + + /** + * Normalize the host component. + * + * @see https://www.rfc-editor.org/rfc/rfc3986.html#section-3.2.2 + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986. + */ + public static function normalizeHost(BackedEnum|Stringable|string|null $host): ?string + { + if ($host instanceof BackedEnum) { + $host = (string) $host->value; + } + + if ($host instanceof Stringable) { + $host = (string) $host; + } + + if (null === $host || '' === $host || false !== filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { + return $host; + } + + if (str_starts_with($host, '[')) { + return IPv6Converter::normalize($host); + } + + $host = strtolower($host); + + return (!str_contains($host, '%')) ? $host : preg_replace_callback( + '/%[a-f0-9]{2}/', + fn (array $matches) => 1 === preg_match('/%([0-7][0-9a-f])/', $matches[0]) ? rawurldecode($matches[0]) : strtoupper($matches[0]), + $host + ); + } + + /** + * Encode Query or Fragment. + * + * Generic delimiters ":", "@", "?", and "/" MUST NOT be encoded + */ + public static function encodeQueryOrFragment(BackedEnum|Stringable|string|null $component): ?string + { + static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.self::REGEXP_PART_SUBDELIM.':@\/?]+|'.self::REGEXP_PART_ENCODED.'/'; + + return self::encode($component, $pattern); + } + + public static function encodeQueryKeyValue(mixed $component): ?string + { + static $pattern = '/[^'.self::REGEXP_PART_UNRESERVED.']+|'.self::REGEXP_PART_ENCODED.'/'; + $encoder = static fn (array $found): string => 1 === preg_match('/[^'.self::REGEXP_PART_UNRESERVED.']/', rawurldecode($found[0])) ? rawurlencode($found[0]) : $found[0]; + $filteredComponent = self::filterComponent($component); + + return match (true) { + null === $filteredComponent => throw new SyntaxError(sprintf('A pair key/value must be a scalar value `%s` given.', gettype($component))), + 1 === preg_match(self::REGEXP_CHARS_INVALID, $filteredComponent) => rawurlencode($filteredComponent), + default => (string) preg_replace_callback($pattern, $encoder, $filteredComponent), + }; + } + + private static function filterComponent(mixed $component): ?string + { + try { + return StringCoercionMode::Native->coerce($component); + } catch (Throwable $exception) { + throw new SyntaxError( + sprintf('The component must be a scalar value `%s` given.', gettype($component)), + previous: $exception + ); + } + } + + /** + * Encodes the URI component characters using a regular expression to find which characters need encoding. + */ + private static function encode(BackedEnum|Stringable|string|int|bool|null $component, string $pattern): ?string + { + $component = self::filterComponent($component); + if (null === $component || '' === $component) { + return $component; + } + + return (string) preg_replace_callback( + $pattern, + static fn (array $found): string => 1 === preg_match('/[^'.self::REGEXP_PART_UNRESERVED.']/', rawurldecode($found[0])) ? rawurlencode($found[0]) : $found[0], + $component + ); + } + + /** + * Decodes the URI component characters using a closure. + */ + private static function decode(BackedEnum|Stringable|string|int|null $component, Closure $decoder): ?string + { + $component = self::filterComponent($component); + if (null === $component || '' === $component) { + return $component; + } + + if (1 === preg_match(self::REGEXP_CHARS_INVALID, $component)) { + throw new SyntaxError('Invalid component string: '.$component.'.'); + } + + if (1 === preg_match(self::REGEXP_CHARS_ENCODED, $component)) { + return (string) preg_replace_callback(self::REGEXP_CHARS_ENCODED, $decoder, $component); + } + + return $component; + } + + /** + * Decodes the URI component without decoding the unreserved characters which are already encoded. + * + * DEPRECATION WARNING! This method will be removed in the next major point release. + * + * @deprecated Since version 7.6.0 + * @codeCoverageIgnore + * @see Encoder::decodeNecessary() + * + * Create a new instance from the environment. + */ + #[Deprecated(message:'use League\Uri\Encoder::decodeNecessary() instead', since:'league/uri:7.6.0')] + public static function decodePartial(BackedEnum|Stringable|string|int|null $component): ?string + { + return self::decodeNecessary($component); + } +} diff --git a/vendor/league/uri-interfaces/Exceptions/ConversionFailed.php b/vendor/league/uri-interfaces/Exceptions/ConversionFailed.php new file mode 100644 index 0000000..9063ceb --- /dev/null +++ b/vendor/league/uri-interfaces/Exceptions/ConversionFailed.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Exceptions; + +use BackedEnum; +use League\Uri\Idna\Error; +use League\Uri\Idna\Result; +use Stringable; + +final class ConversionFailed extends SyntaxError +{ + private function __construct( + string $message, + private readonly string $host, + private readonly Result $result + ) { + parent::__construct($message); + } + + public static function dueToIdnError(BackedEnum|Stringable|string $host, Result $result): self + { + $reasons = array_map(fn (Error $error): string => $error->description(), $result->errors()); + + if ($host instanceof BackedEnum) { + $host = (string) $host->value; + } + + return new self('Host `'.$host.'` is invalid: '.implode('; ', $reasons).'.', (string) $host, $result); + } + + public function getHost(): string + { + return $this->host; + } + + public function getResult(): Result + { + return $this->result; + } +} diff --git a/vendor/league/uri-interfaces/Exceptions/MissingFeature.php b/vendor/league/uri-interfaces/Exceptions/MissingFeature.php new file mode 100644 index 0000000..034e969 --- /dev/null +++ b/vendor/league/uri-interfaces/Exceptions/MissingFeature.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Exceptions; + +use League\Uri\Contracts\UriException; +use RuntimeException; + +class MissingFeature extends RuntimeException implements UriException +{ +} diff --git a/vendor/league/uri-interfaces/Exceptions/OffsetOutOfBounds.php b/vendor/league/uri-interfaces/Exceptions/OffsetOutOfBounds.php new file mode 100644 index 0000000..737a5cc --- /dev/null +++ b/vendor/league/uri-interfaces/Exceptions/OffsetOutOfBounds.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Exceptions; + +class OffsetOutOfBounds extends SyntaxError +{ +} diff --git a/vendor/league/uri-interfaces/Exceptions/SyntaxError.php b/vendor/league/uri-interfaces/Exceptions/SyntaxError.php new file mode 100644 index 0000000..f44cca6 --- /dev/null +++ b/vendor/league/uri-interfaces/Exceptions/SyntaxError.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri\Exceptions; + +use InvalidArgumentException; +use League\Uri\Contracts\UriException; + +class SyntaxError extends InvalidArgumentException implements UriException +{ +} diff --git a/vendor/league/uri-interfaces/FeatureDetection.php b/vendor/league/uri-interfaces/FeatureDetection.php new file mode 100644 index 0000000..be0c4d6 --- /dev/null +++ b/vendor/league/uri-interfaces/FeatureDetection.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri; + +use finfo; +use League\Uri\Exceptions\MissingFeature; +use League\Uri\IPv4\Calculator; + +use function class_exists; +use function defined; +use function extension_loaded; +use function function_exists; + +use const PHP_INT_SIZE; + +/** + * Allow detecting features needed to make the packages work. + */ +final class FeatureDetection +{ + public static function supportsFileDetection(): void + { + static $isSupported = null; + $isSupported = $isSupported ?? class_exists(finfo::class); + + $isSupported || throw new MissingFeature('Support for file type detection requires the `fileinfo` extension.'); + + } + + public static function supportsIdn(): void + { + static $isSupported = null; + $isSupported = $isSupported ?? (function_exists('\idn_to_ascii') && defined('\INTL_IDNA_VARIANT_UTS46')); + + $isSupported || throw new MissingFeature('Support for IDN host requires the `intl` extension for best performance or run "composer require symfony/polyfill-intl-idn" to install a polyfill.'); + } + + public static function supportsIPv4Conversion(): void + { + static $isSupported = null; + $isSupported = $isSupported ?? (extension_loaded('gmp') || extension_loaded('bcmath') || (4 < PHP_INT_SIZE)); + + $isSupported || throw new MissingFeature('A '.Calculator::class.' implementation could not be automatically loaded. To perform IPv4 conversion use a x.64 PHP build or install one of the following extension GMP or BCMath. You can also ship your own implementation.'); + } + + public static function supportsDom(): void + { + static $isSupported = null; + $isSupported = $isSupported ?? extension_loaded('dom'); + + $isSupported || throw new MissingFeature('To use a DOM related feature, the DOM extension must be installed in your system.'); + } +} diff --git a/vendor/league/uri-interfaces/HostFormat.php b/vendor/league/uri-interfaces/HostFormat.php new file mode 100644 index 0000000..baf7375 --- /dev/null +++ b/vendor/league/uri-interfaces/HostFormat.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri; + +enum HostFormat +{ + case Ascii; + case Unicode; +} diff --git a/vendor/league/uri-interfaces/HostRecord.php b/vendor/league/uri-interfaces/HostRecord.php new file mode 100644 index 0000000..e379568 --- /dev/null +++ b/vendor/league/uri-interfaces/HostRecord.php @@ -0,0 +1,448 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace League\Uri; + +use BackedEnum; +use Exception; +use JsonSerializable; +use League\Uri\Contracts\UriComponentInterface; +use League\Uri\Exceptions\SyntaxError; +use League\Uri\Idna\Converter as IdnConverter; +use Stringable; +use Throwable; + +use function array_key_first; +use function count; +use function explode; +use function filter_var; +use function get_object_vars; +use function in_array; +use function inet_pton; +use function is_object; +use function preg_match; +use function rawurldecode; +use function strpos; +use function strtolower; +use function substr; + +use const FILTER_FLAG_IPV4; +use const FILTER_FLAG_IPV6; +use const FILTER_VALIDATE_IP; + +/** + * @phpstan-type HostRecordSerializedShape array{0: array{host: ?string}, 1: array{}} + */ +final class HostRecord implements JsonSerializable +{ + /** + * Maximum number of host cached. + * + * @var int + */ + private const MAXIMUM_HOST_CACHED = 100; + + private const REGEXP_NON_ASCII_PATTERN = '/[^\x20-\x7f]/'; + + /** + * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 + * + * invalid characters in host regular expression + */ + private const REGEXP_INVALID_HOST_CHARS = '/ + [:\/?#\[\]@ ] # gen-delims characters as well as the space character + /ix'; + + /** + * General registered name regular expression. + * + * @see https://tools.ietf.org/html/rfc3986#section-3.2.2 + * @see https://regex101.com/r/fptU8V/1 + */ + private const REGEXP_REGISTERED_NAME = '/ + (?(DEFINE) + (?[a-z0-9_~\-]) # . is missing as it is used to separate labels + (?[!$&\'()*+,;=]) + (?%[A-F0-9]{2}) + (?(?:(?&unreserved)|(?&sub_delims)|(?&encoded))*) + ) + ^(?:(?®_name)\.)*(?®_name)\.?$ + /ix'; + + /** + * Domain name regular expression. + * + * Everything but the domain name length is validated + * + * @see https://tools.ietf.org/html/rfc1034#section-3.5 + * @see https://tools.ietf.org/html/rfc1123#section-2.1 + * @see https://regex101.com/r/71j6rt/1 + */ + private const REGEXP_DOMAIN_NAME = '/ + (?(DEFINE) + (? [a-z0-9]) # alpha digit + (? [a-z0-9-]) # alpha digit and hyphen + (? (?&let_dig_hyp){0,61}(?&let_dig)) # domain label end + (?